T-SQL 分组依据:When empty ResultSet

T-SQL Group by When empty ResultSet

提问人:Shire 提问时间:1/18/2022 最后编辑:jarlhShire 更新时间:1/18/2022 访问量:74

问:

当清空 ResultSet 和部件记录时,如何选择分组计数

表 T 架构为 列 A int,列 B int

数据演示 A 是

A    B
1    11
1    2
1    Null
2    1
2    21
3    12
3    Null

数据演示 B 是

A    B
2    1
2    21
3    12
3    Null
4    11
4    2
4    Null

数据演示 C 是

A    B
(empty record)

我想选择这个 ResultSet

A    B
1    Bcount
2    Bcount
3    Bcount
4    Bcount

我的SQL代码是

select A,Count(B) FROM T
group by A

当数据演示 A 时,我丢失了 A=4 结果

当数据演示 B 时,我丢失了 A=1 结果

当数据演示C丢失所有结果时,ResultSet为空。

T-SQL

评论

1赞 MatBailie 1/18/2022
创建一个始终包含需要报告的所有实体的维度表,然后使用SELECT dimension.A, COUNT(data.B) FROM dimension LEFT JOIN data ON data.A = dimension.A GROUP BY dimension.A
0赞 Gabriel Durac 1/18/2022
您的搜索值是否始终为 1,2,3,4 ?您需要一个单独的表来定义搜索值。如果表为空或缺少值,则 SQL 无法猜测缺少的数据是什么。
0赞 Ian Kenney 1/18/2022
你期望 A = 1、2、3 和 4 与你的数据有什么值?Bcount
0赞 Shire 1/18/2022
是的,我总是搜索 A=1,2,3,4
0赞 Shire 1/18/2022
@ian-肯尼 是的,总是搜索 A=1,2,3,4

答:

0赞 Ian Kenney 1/18/2022 #1

这个问题仍然不清楚,但也许你正在追求类似的东西

select v.A, count(t.b)
from (select 1 as A union select 2 union select 3 union select 4) as v 
left join t on t.a = v.a 
group by 1 

评论

0赞 Shire 1/18/2022
完美的代码。谢谢你的回答,group by 1 更改为 group by v.A 是可以的。
1赞 LukStorms 1/18/2022 #2

您可以左联接 VALUES

SELECT V.A, COUNT(T.B) AS Total_B
FROM (VALUES (1),(2),(3),(4)) V(A)
LEFT JOIN T ON (T.A = V.A) 
GROUP BY V.A
ORDER BY V.A;

或者为 A 的值创建引用表。 然后左联接到引用表。

CREATE TABLE REF_A (A INT PRIMARY KEY);
INSERT INTO REF_A (A) VALUES (1),(2),(3),(4);

SELECT A.A, COUNT(T.B) AS Total_B
FROM REF_A A
LEFT JOIN T ON (T.A = A.A) 
GROUP BY A.A
ORDER BY A.A;

db<>fiddle 演示在这里

评论

0赞 Shire 1/18/2022
谢谢你的回答,伊恩·肯尼(Ian Kenney)解决了我的问题,你的代码非常优雅。