我有一张个人电脑的表格,想了解一下最大的电脑制造商的数量。由于数据将显示在饼图中,而目前大约有45家不同的制造商,因此我希望获得前5名的数量,然后将其他所有内容合并为“其他”。
以下查询将按制造商返回所有PC的计数:
SELECT
f_assetmanufacturer,
COUNT(*) as 'PCs'
FROM tb_assets
GROUP BY f_assetmanufacturer上面查询的示例输出是:
f_assetmanufacturer PCs
-----------------------------
Dell 100
HP 50
Lenovo 25
Acer 24
Toshiba 23
Microsoft 20
Equus 20
Thinix 20
Advantech 20期望的输出如下所示:
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‘类别中,以简化饼图中的输出?
发布于 2016-12-22 06:13:35
您可以使用两个级别的聚合来完成此操作:
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(),这取决于您希望如何处理“第五个”位置中的平局。
发布于 2016-12-22 06:13:23
您可以使用CTE构建两个集合,并将数据合并在一起,如下所示:
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 otherhttps://stackoverflow.com/questions/41272717
复制相似问题