在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]

请提供示例数据、所需结果以及生成当前结果的查询。“我尝试过的结果为空…”哪里???我们没有看到任何代码!请阅读这篇文章,学习如何提问。请提供示例数据、所需结果以及生成当前结果的查询。“我尝试过的结果为空…”哪里???我们没有看到任何代码!请阅读这篇文章,学习如何提问。