算 TOP 5,其他都算“其他”

Bee*_*ems 0 t-sql sql-server sql-server-2014

我有一桌电脑,想了解顶级电脑制造商的数量。由于数据将显示在饼图中,并且目前有大约 45 个不同的制造商,因此我想获取前 5 个制造商的数量,然后将其他所有内容合并到“其他”中。

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

SELECT 
    f_assetmanufacturer,
    COUNT(*) as 'PCs'
FROM tb_assets 
GROUP BY f_assetmanufacturer
Run Code Online (Sandbox Code Playgroud)

上述查询的示例输出为:

f_assetmanufacturer    PCs
-----------------------------
Dell                   100
HP                     50
Lenovo                 25
Acer                   24
Toshiba                23
Microsoft              20
Equus                  20
Thinix                 20
Advantech              20
Run Code Online (Sandbox Code Playgroud)

期望的输出如下:

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
Run Code Online (Sandbox Code Playgroud)

如何仅选择前 5 个制造商并将所有剩余制造商合并到“其他”类别中,以简化饼图中的输出?

Gor*_*off 5

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

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;
Run Code Online (Sandbox Code Playgroud)

注意:您可能需要使用rank()dense_rank(),具体取决于您希望如何处理“第五”位置的关系。