有没有办法做一些像SQL NOT top语句?

时间:2011-03-24 16:07:21

标签: sql tsql

我正在尝试制作一个SQL语句,它为我提供了前X个记录,然后所有其他的总和。第一部分很容易......

select top 3 Department, Sum(sales) as TotalSales
from Sales
group by Department

如果我联合第二个查询类似于......

,那会更好
select NOT top 3 "Others" as Department, Sum(sales) as TotalSales
from Sales
group by Department

...对于看起来像

的结果集
Department    TotalSales
-----------   -----------
Mens Clothes  120.00
Jewelry       113.00
Shoes          98.00
Others        312.00

有没有办法在TOP上做一个等价的NOT运算符? (我知道我可以创建一个顶级X的临时表并使用它,但我更喜欢一个只有一个sql语句的解决方案。)

4 个答案:

答案 0 :(得分:6)

WITH    q AS
        (
        SELECT  ROW_NUMBER() OVER (ORDER BY SUM(sales) DESC) rn,
                CASE
                WHEN ROW_NUMBER() OVER (ORDER BY SUM(sales) DESC) <= 3 THEN
                        department
                ELSE
                        'Others'
                END AS dept,
                SUM(sales) AS sales
        FROM    sales
        GROUP BY
                department
        )
SELECT  dept, SUM(sales)
FROM    q
GROUP BY
        dept
ORDER BY
        MAX(rn)

答案 1 :(得分:3)

WITH cte
     As (SELECT Department,
                Sum(sales) as TotalSales
         from   Sales
         group  by Department),
     cte2
     AS (SELECT *,
                CASE
                  WHEN ROW_NUMBER() OVER (ORDER BY TotalSales DESC) <= 3 THEN
                  ROW_NUMBER() OVER (ORDER BY TotalSales DESC)
                  ELSE 4
                END AS Grp
         FROM   cte)
SELECT MAX(CASE
             WHEN Grp = 4 THEN 'Others'
             ELSE Department
           END)        AS Department,
       SUM(TotalSales) AS TotalSales
FROM   cte2
GROUP  BY Grp
ORDER  BY Grp  

答案 2 :(得分:1)

您可以使用联合来汇总所有其他部门。公用表表达式使其更具可读性:

; with Top3Sales as
        (
        select  top 3 Department
        ,       Sum(sales) as TotalSales
        from    Sales
        group by 
                Department
        order by 
                Sum(sales) desc
        )
select  Department
,       TotalSales
from    Top3Sales
union all
select  'Other'
,       SUM(Sales)
from    Sales
where   Department not in (select Department from Top3Sales)

Example at data.stackexchange.com

答案 3 :(得分:1)

SELECT TOP 3 Department, SUM(Sales) AS TotalSales
FROM   Sales
GROUP BY Department
UNION ALL
SELECT 'Others', SUM(s.Sales)
FROM   Sales s
WHERE  s.Department NOT IN
       (SELECT Department
        FROM   (SELECT TOP 3 Department, SUM(Sales)
                FROM   Sales
                GROUP BY Department) D)