在SQL Server中显示动态范围中的计数
我正在根据表中的最大值创建范围。例如,如果表中的最大值为45,则它将创建类似于0-10 11-20 21-30 31-40 41-50的范围,然后希望显示该范围内的计数。下面是我在SQL中尝试的内容在SQL Server中显示动态范围中的计数,sql,sql-server-2012,Sql,Sql Server 2012,我正在根据表中的最大值创建范围。例如,如果表中的最大值为45,则它将创建类似于0-10 11-20 21-30 31-40 41-50的范围,然后希望显示该范围内的计数。下面是我在SQL中尝试的内容 DECLARE @VariableData TABLE (id INT, [label] NVARCHAR(50), PendingDays INT ) INSERT INTO @VariableData (id, [label], PendingDays) VALUES(1, 'Red', 5)
DECLARE @VariableData TABLE (id INT, [label] NVARCHAR(50), PendingDays INT )
INSERT INTO @VariableData (id, [label], PendingDays) VALUES(1, 'Red', 5)
INSERT INTO @VariableData (id, [label], PendingDays) VALUES(2, 'Green', 7)
INSERT INTO @VariableData (id, [label], PendingDays) VALUES(3, 'Yellow', 25)
INSERT INTO @VariableData (id, [label], PendingDays) VALUES(4, 'Brown', 27)
INSERT INTO @VariableData (id, [label], PendingDays) VALUES(5, 'Black', 45)
INSERT INTO @VariableData (id, [label], PendingDays) VALUES(6, 'Red', 8)
INSERT INTO @VariableData (id, [label], PendingDays) VALUES(7, 'Red', 11)
INSERT INTO @VariableData (id, [label], PendingDays) VALUES(8, 'Green', 22)
INSERT INTO @VariableData (id, [label], PendingDays) VALUES(9, 'Black', 1)
SELECT *
FROM @VariableData
我得到这个结果:
我想显示如下结果
有什么帮助吗?最简单的方法是使用聚合用例
SELECT [label],
SUM(CASE WHEN Pending Days BETWEEN 0 AND 10 THEN 1 ELSE 0 END) AS [0-10],
SUM(CASE WHEN Pending Days BETWEEN 11 AND 20 THEN 1 ELSE 0 END) AS [11-20]
FROM @VariableData
GROUP BY [label]
您可以计算范围,然后根据范围的计算结果将其分为五组:
select vd.*,
floor((pendingdays - min_pendingdays) * 5.0 / (max_pendingdays - min_pendingdays + 1)) as tile
from (select vd.*,
min(pendingdays) over () as min_pendingdays,
max(pendingdays) over () as max_pendingdays
from VariableData vd
) vd;
这会将结果放入行中。您可以将这些列聚合为以下列:
select label,
sum(case when tile = 0 then 1 end) as tile_1,
sum(case when tile = 1 then 1 end) as tile_2,
sum(case when tile = 2 then 1 end) as tile_3,
sum(case when tile = 3 then 1 end) as tile_4,
sum(case when tile = 4 then 1 end) as tile_5
from (select vd.*,
floor((pendingdays - min_pendingdays) * 5.0 / (max_pendingdays - min_pendingdays + 1)) as tile
from (select vd.*,
min(pendingdays) over () as min_pendingdays,
max(pendingdays) over () as max_pendingdays
from VariableData vd
) vd
) vd
group by label;
唯一需要注意的是,不能根据数据中的值命名列。这需要动态SQL
是一个dbfiddle。很酷,但基于表的最大值,范围是动态的,而且我必须计算该范围内的待定天数行