首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数前5名,其他都算“其他”

数前5名,其他都算“其他”
EN

Stack Overflow用户
提问于 2016-12-22 06:07:05
回答 2查看 111关注 0票数 0

我有一张个人电脑的表格,想了解一下最大的电脑制造商的数量。由于数据将显示在饼图中,而目前大约有45家不同的制造商,因此我希望获得前5名的数量,然后将其他所有内容合并为“其他”。

以下查询将按制造商返回所有PC的计数:

代码语言:javascript
复制
SELECT 
    f_assetmanufacturer,
    COUNT(*) as 'PCs'
FROM tb_assets 
GROUP BY f_assetmanufacturer

上面查询的示例输出是:

代码语言:javascript
复制
f_assetmanufacturer    PCs
-----------------------------
Dell                   100
HP                     50
Lenovo                 25
Acer                   24
Toshiba                23
Microsoft              20
Equus                  20
Thinix                 20
Advantech              20

期望的输出如下所示:

代码语言:javascript
复制
f_assetmanufacturer    PCs                   f_assetmanufacturer    PCs
-----------------------------                -----------------------------
Dell                   100                   Dell                   100
HP                     50                    Other                  100
Lenovo                 25          or        HP                     50
Acer                   24                    Lenovo                 25    
Toshiba                23                    Acer                   24
Other                  100                   Toshiba                23

如何只选择前5个制造商,并将所有剩余的制造商合并到一个'Other‘类别中,以简化饼图中的输出?

EN

回答 2

Stack Overflow用户

发布于 2016-12-22 06:13:35

您可以使用两个级别的聚合来完成此操作:

代码语言:javascript
复制
SELECT (CASE WHEN seqnum <= 5 THEN f_assetmanufacturer ELSE 'Other' END) as assetmanufacturer,
       SUM(PCs) as PCs
FROM (SELECT f_assetmanufacturer, COUNT(*) as PCs,
             ROW_NUMBER() OVER (ORDER BY COUNT(*) DESC) as seqnum
      FROM tb_assets 
      GROUP BY f_assetmanufacturer
     ) a
GROUP BY (CASE WHEN seqnum <= 5 THEN f_assetmanufacturer ELSE 'Other' END)
ORDER BY PCs DESC;

注意:您可能希望使用rank()dense_rank(),这取决于您希望如何处理“第五个”位置中的平局。

票数 4
EN

Stack Overflow用户

发布于 2016-12-22 06:13:23

您可以使用CTE构建两个集合,并将数据合并在一起,如下所示:

代码语言:javascript
复制
with top5
as (
SELECT top 5
    f_assetmanufacturer,
    COUNT(*) as 'PCs'
FROM tb_assets 
GROUP BY f_assetmanufacturer
order by 2 desc)
,other
as(
select 'Other',
    COUNT(*) as 'PCs'
FROM tb_assets a
where not exists (select 'ne' from top5 t where a.f_assetmanufacturer = t.f_assetmanufacturer)))

select * from top5
union all
select * from other
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41272717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档