我已经尝试过isnull,但如果该库中的计数为0,它仍然会忽略某些库中的数据。我使用group by来计算每个组中的观察值数量。对于观测值为0的组,SQL不会打印该组的任何行。我想要该组的一行和相应的0值。
我已经尝试过了:Keep zero values with GROUP BY and SUM in mysql
谢谢!
使用数据编辑:
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]发布于 2020-11-14 03:17:06
您可以创建"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 |
+----+-----+-----+发布于 2020-11-14 03:28:38
这里有一种方法,它将bin创建为单独的列。然后使用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]https://stackoverflow.com/questions/64826410
复制相似问题