groupby以计数,并在leftjoin之后



我有一个表客户端,有三列IdPatient,keyPatient,nbvisites和一个表logclient有三列IdPatient,keyPatient,date

我需要按[IdPPatient]、[keyPatient]进行分组,并对logclient 表上的日志进行计数

SELECT [IdPatient],[keyPatient], count(*) 
FROM [dbo].[logclient ]
group by [IdPatient], [keyPatient]

以及在我需要提取表客户端上的记录之后,这些记录的nbvisits与我以前的计数(*(不同(我也可以在表客户端上没有客户端记录(。

我该如何通过一个查询来做到这一点?

表客户端

| IdPatient| keyPatient |nbvisits
|----------|---         |
|    18569 | 3          |1
|    18571 | 2          |1
|    20000 | 0          |2

表日志客户端

| IdPatient | keyPatient |date
|---------- |---         |
|    18569  | 3          |1990
|    18571  | 2          |1990
|    18571  | 2          |1990
|    20000  | 0          |1990
|    20000  | 0          |1990
|    200001 | 2          |1990

在我按IdPatient和KeyPatient分组并计数之后

SELECT [IdPatient],[keyPatient], count(*) 
FROM [dbo].[logclient]
group by [IdPatient], [keyPatient]

我有

| IdPatient | keyPatient |count
|---------- |---         |
|    18569  | 3          |1
|    18571  | 2          |2
|    20000  | 0          |2
|    200001 | 2          |1

现在我需要检查第一个表CLIENT是否计数<gt;nbvisites,并有我的计数不同于nbvisites-的行

最终结果:

| IdPatient | keyPatient |count
|---------- |---         |
|    18571  | 2          |2
|    200001 | 2          |1

将查询打包为派生表(子查询(。使用EXISTS查看是否存在具有相同IdPatient值但其他计数的客户端行。

select dt.*
from
(
SELECT [IdPatient], [keyPatient], count(*) cnt
FROM [dbo].[logclient ]
group by [IdPatient], [keyPatient]
) dt
where exists (select * from client c
where dt.[IdPatient] = c.[IdPatient]
and dt.cnt <> c.[nbvisits])

返回没有相同计数的客户端行的行:

select dt.*
from
(
SELECT [IdPatient], [keyPatient], count(*) cnt
FROM [dbo].[logclient ]
group by [IdPatient], [keyPatient]
) dt
where not exists (select * from client c
where dt.[IdPatient] = c.[IdPatient]
and dt.cnt = c.[nbvisits])

相关内容

最新更新