左连接的 SQL 计数

Posted

技术标签:

【中文标题】左连接的 SQL 计数【英文标题】:SQL count with left join 【发布时间】:2021-10-19 01:37:44 【问题描述】:

我想使用左连接从 2 个表中获取数据,这是我的表

第一个表(文件夹)

number date
123/123 2021-08-14
321/321 2021-08-15
456/456 2021-08-15
098/098 2021-08-16
654/654 2021-08-17

第二张表(证书)

code folder_number
asd1 123/123
asd2 123/123
asd3 123/123
asd4 123/123
asd5 123/123
qwe1 321/321
qwe2 321/321
qwe3 321/321
zxc1 456/456
zxc2 456/456
zxc3 456/456
rty1 098/098
fgh1 654/654

我只使用folder 表中的date 列,我想通过datefolder 表中计算所有数据并左连接certificate 表,该表还计算所有连接/相关的code number 列来自folder 表,这是我的代码

SELECT b.date, COUNT(c.code) as code, COUNT(b.date) as datecount
                FROM folder b
                INNER JOIN certificate c
                    ON c.folder_number = b.number
            GROUP BY b.date
            ORDER BY b.date

我对该代码的期望:

date code datecount
2021-08-14 5 1
2021-08-15 6 2
2021-08-16 1 1
2021-08-17 1 1

但是,这是我使用该代码时得到的结果:

date code datecount
2021-08-14 5 5
2021-08-15 6 6
2021-08-16 1 1
2021-08-17 1 1

如何解决?我也尝试使用inner join,但结果是一样的

谢谢,抱歉我的英语不好顺便说一句

【问题讨论】:

【参考方案1】:

你应该计算number的不同数量而不是COUNT(b.date)

SELECT b.date, 
       COUNT(c.code) as code, 
       COUNT(DISTINCT b.number) as datecount
FROM folder b INNER JOIN certificate c
ON c.folder_number = b.number
GROUP BY b.date
ORDER BY b.date;

如果folder 中的numbers 在certificate 中可能不匹配,那么您应该使用LEFT 加入。

请参阅demo。

【讨论】:

以上是关于左连接的 SQL 计数的主要内容,如果未能解决你的问题,请参考以下文章

EF Core 左连接计数

Clickhouse 数组连接与左连接和计算计数

PostgreSQL - 带有错误计数输出的左连接

具有多个左连接和计数的错误计算(Laravel)

NHibernate左连接选择计数在一对多关系中

MySQL左连接计数不起作用