想象一下,我有一张表格,显示Acme Widgets的销售情况以及销售地点.按国家/地区生成报表分组销售相当容易.找到前10名相当容易.但我想要的是显示前10名,然后最后一行说其他.例如.,
Ctry | Sales ============= GB | 100 US | 80 ES | 60 ... IT | 10 Other | 50
我一直在寻找年龄,但似乎找不到任何帮助,超过标准前十名.
TIA
解决方法
我在这里尝试了其他一些解决方案,但它们似乎要么稍微关闭,要么排序不太正确.
我对Microsoft sql Server解决方案的尝试似乎正常工作:
SELECT Ctry,Sales FROM ( SELECT TOP 2 Ctry,SUM(Sales) AS Sales FROM Table1 GROUP BY Ctry ORDER BY Sales DESC ) AS Q1 UNION ALL SELECT 'Other' AS Ctry,SUM(Sales) AS Sales FROM Table1 WHERE Ctry NOT IN (SELECT TOP 2 Ctry FROM Table1 GROUP BY Ctry ORDER BY SUM(Sales) DESC)
请注意,在我的示例中,我只使用TOP 2而不是TOP 10.这仅仅是因为我的测试数据更加有限.您可以轻松地将2替换为您自己的数据中的10.
这是创建表的sql脚本:
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[Table1]( [Ctry] [varchar](50) NOT NULL,[Sales] [float] NOT NULL ) ON [PRIMARY] GO SET ANSI_PADDING OFF
我的数据看起来像这样:
GB 10 GB 21.2 GB 34 GB 16.75 US 10 US 11 US 56.43 FR 18.54 FR 98.58 WE 44.33 WE 11.54 WE 89.21 KR 10 PO 10 DE 10
请注意,查询结果由Sales值聚合而非字母国家/地区代码正确排序,并且“其他”类别始终为最后一个,即使它的Sales值聚合通常会将其推送到列表顶部.
我不是说这是最好的(阅读:最优)解决方案,但是,对于我提供的数据集,它似乎运行得很好.