Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将SQL中的前N个类别与“其他”中的所有其他类别相加_Sql_Sql Server - Fatal编程技术网

将SQL中的前N个类别与“其他”中的所有其他类别相加

将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'),

我试图对一个数据集进行分类,其中具有前3个记录计数的描述类别将被汇总为前3个,所有其他类别将被计入其他类别。我这样做是为了SSRS报告的目的。我使用了一个窗口函数来组织每个类别,但我很难创建最终结果

     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…”。非常感谢。