将SQL中的前N个类别与“其他”中的所有其他类别相加
我试图对一个数据集进行分类,其中具有前3个记录计数的描述类别将被汇总为前3个,所有其他类别将被计入其他类别。我这样做是为了SSRS报告的目的。我使用了一个窗口函数来组织每个类别,但我很难创建最终结果将SQL中的前N个类别与“其他”中的所有其他类别相加,sql,sql-server,Sql,Sql Server,我试图对一个数据集进行分类,其中具有前3个记录计数的描述类别将被汇总为前3个,所有其他类别将被计入其他类别。我这样做是为了SSRS报告的目的。我使用了一个窗口函数来组织每个类别,但我很难创建最终结果 declare @t table(id int, description varchar(50)) insert into @t values(123, 'Cardiac'), (124, 'Cardiac'),
declare @t table(id int, description varchar(50))
insert into @t values(123, 'Cardiac'),
(124, 'Cardiac'),
(125, 'Cardiac'),
(126, 'Cardiac'),
(222, 'Digestive'),
(223, 'Digestive'),
(224, 'Digestive'),
(225, 'Digestive'),
(226, 'Digestive'),
(333, 'Muscular'),
(334, 'Muscular'),
(335, 'Muscular'),
(336, 'Muscular'),
(444, 'Nose'),
(445, 'Nose'),
(446, 'Nose'),
(447, 'Nose'),
(448, 'Nose'),
(449, 'Nose'),
(555, 'Ear'),
(555, 'Ear'),
(666, 'Mouth')
到目前为止,我已经写过:
select *, row_number()over(partition by description order by id) as ranks
from @t
group by id, description
我想要的结果是:
Description Count
Nose 6
Digestive 5
Cardiac 4
Muscular 4
Other 3
我认为这涉及到使用带有计数的窗口函数,但我似乎无法理解。您可以使用两个级别的聚合:
select (case when seqnum <= 4 then description else 'Other' end), sum(cnt) as cnt
from (select description, count(*) as cnt,
row_number() over (order by count(*) desc) as seqnum
from @t
group by description
) d
group by (case when seqnum <= 4 then description else 'Other' end)
order by min(seqnum);
您可以使用两个级别的聚合:
select (case when seqnum <= 4 then description else 'Other' end), sum(cnt) as cnt
from (select description, count(*) as cnt,
row_number() over (order by count(*) desc) as seqnum
from @t
group by description
) d
group by (case when seqnum <= 4 then description else 'Other' end)
order by min(seqnum);
使用窗口函数计数:
看。
结果:
使用窗口函数计数:
看。
结果:
考虑到您似乎希望处理领带的方式,请使用秩而不是行号:
select description
, sum(cnt) as cnt
from (
select case
when rank() over(order by count(*) desc) <= 3 then description
else 'Other' end as description
, count(*) as cnt
from @t
group by description
)
group by description
考虑到您似乎希望处理领带的方式,请使用秩而不是行号:
select description
, sum(cnt) as cnt
from (
select case
when rank() over(order by count(*) desc) <= 3 then description
else 'Other' end as description
, count(*) as cnt
from @t
group by description
)
group by description
我收到一个列名称“cnt”无效的错误。我想这是由于cnt desc在派生表的窗口函数中的顺序造成的。我想我明白了。我将“按cnt订购”改为“按计数订购*@jackstraw22…”。谢谢。我收到一个列名称“cnt”无效的错误。我想这是由于cnt desc在派生表的窗口函数中的顺序造成的。我想我明白了。我将“按cnt订购”改为“按计数订购*@jackstraw22…”。非常感谢。