加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SQL生产前十名和其他

发布时间:2020-12-12 07:05:11 所属栏目:MsSql教程 来源:网络整理
导读:想象一下,我有一张表格,显示Acme Widgets的销售情况以及销售地点.按国家/地区生成报表分组销售相当容易.找到前10名相当容易.但我想要的是显示前10名,然后最后一行说其他.例如., Ctry | Sales=============GB | 100US | 80ES | 60...IT | 10Other | 50 我一直
想象一下,我有一张表格,显示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值聚合通常会将其推送到列表顶部.

我不是说这是最好的(阅读:最优)解决方案,但是,对于我提供的数据集,它似乎运行得很好.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读