在SQL Server中执行计数和分组时,如何保留0值项?
我已经尝试了在SQL Server中执行计数和分组时,如何保留0值项?,sql,sql-server,Sql,Sql Server,我已经尝试了isnull,但是如果某个数据箱中的计数为0,它仍然会遗漏某些数据箱。我使用group by来计算每组的观察次数。对于观察值为0的组,SQL不会打印该组的行。我需要该组的一行和相应的0值 我试过这个: 谢谢 使用数据编辑: Vector = [1, 2, 2, 3, 4, 5, 5, 9, 10, 10] 我想数一数落入垃圾箱的上述观察结果的数量: [1-2, 3-4, 5-6, 7-8, 9-10] 结果应该是 [3,2,2,0,3] 不管我得到什么 [3,2,2,3] 您
isnull
,但是如果某个数据箱中的计数为0,它仍然会遗漏某些数据箱。我使用group by来计算每组的观察次数。对于观察值为0的组,SQL不会打印该组的行。我需要该组的一行和相应的0值
我试过这个:
谢谢
使用数据编辑:
Vector = [1, 2, 2, 3, 4, 5, 5, 9, 10, 10]
我想数一数落入垃圾箱的上述观察结果的数量:
[1-2, 3-4, 5-6, 7-8, 9-10]
结果应该是
[3,2,2,0,3]
不管我得到什么
[3,2,2,3]
您可以创建“bin”派生表并将其左连接到:
SELECT bin.a, bin.b, COUNT(v.val) AS cnt
FROM (VALUES (1,2),(3,4),(5,6),(7,8),(9,10)) bin(a,b)
LEFT JOIN vector v
ON v.val BETWEEN bin.a AND bin.b
GROUP BY bin.a, bin.b
ORDER BY bin.a, bin.b;
输出:
+----+-----+-----+
| a | b | cnt |
+----+-----+-----+
| 1 | 2 | 3 |
| 3 | 4 | 2 |
| 5 | 6 | 2 |
| 7 | 8 | 0 |
| 9 | 10 | 3 |
+----+-----+-----+
您可以创建“bin”派生表并将其左连接到:
SELECT bin.a, bin.b, COUNT(v.val) AS cnt
FROM (VALUES (1,2),(3,4),(5,6),(7,8),(9,10)) bin(a,b)
LEFT JOIN vector v
ON v.val BETWEEN bin.a AND bin.b
GROUP BY bin.a, bin.b
ORDER BY bin.a, bin.b;
输出:
+----+-----+-----+
| a | b | cnt |
+----+-----+-----+
| 1 | 2 | 3 |
| 3 | 4 | 2 |
| 5 | 6 | 2 |
| 7 | 8 | 0 |
| 9 | 10 | 3 |
+----+-----+-----+
这里有一种方法,它将容器创建为单独的列。然后使用CONCAT_WS和QUOTENAME创建最后一个字符串。像这样的
declare @Vector varchar(max)='1, 2, 2, 3, 4, 5, 5, 9, 10, 10';
with
range_cte(n) as (
select * from (values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) v(n))
select quotename(concat_ws(',',
sum(case when sc.value in(1, 2) then 1 else 0 end) ,
sum(case when sc.value in(3, 4) then 1 else 0 end) ,
sum(case when sc.value in(5, 6) then 1 else 0 end) ,
sum(case when sc.value in(7, 8) then 1 else 0 end) ,
sum(case when sc.value in(9, 10) then 1 else 0 end)),'[]')
from range_cte rc
left join string_split(@Vector, ',') sc on rc.n=sc.value;
输出
[3,2,2,0,3]
这里有一种方法,它将容器创建为单独的列。然后使用CONCAT_WS和QUOTENAME创建最后一个字符串。像这样的
declare @Vector varchar(max)='1, 2, 2, 3, 4, 5, 5, 9, 10, 10';
with
range_cte(n) as (
select * from (values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) v(n))
select quotename(concat_ws(',',
sum(case when sc.value in(1, 2) then 1 else 0 end) ,
sum(case when sc.value in(3, 4) then 1 else 0 end) ,
sum(case when sc.value in(5, 6) then 1 else 0 end) ,
sum(case when sc.value in(7, 8) then 1 else 0 end) ,
sum(case when sc.value in(9, 10) then 1 else 0 end)),'[]')
from range_cte rc
left join string_split(@Vector, ',') sc on rc.n=sc.value;
输出
[3,2,2,0,3]
请提供示例数据、所需结果以及生成当前结果的查询。“我尝试过的结果为空…”哪里???我们没有看到任何代码!请阅读这篇文章,学习如何提问。请提供示例数据、所需结果以及生成当前结果的查询。“我尝试过的结果为空…”哪里???我们没有看到任何代码!请阅读这篇文章,学习如何提问。