如何在保留最后一行的汇总情况下对嵌套查询结果进行排序?

3
如何按照卖家姓名排序结果并保持汇总信息在底部?
由于分组应用于嵌套的SELECT语句中,因此无法使用ORDER BY;而由于分组未应用于顶层,也不能使用GROUPING。
请点击此处查看SQL Fiddle中的工作示例。
CREATE TABLE Sales 
(
        SellerID    INT
    ,   StoreID     INT
    ,   Price       MONEY
);

CREATE TABLE Sellers 
(
        SellerID    INT
    ,   Name        VARCHAR(50)  
)

INSERT INTO Sales VALUES 
    (1, 1, 100),
    (1, 1, 100),
    (1, 1, 100),
    (2, 2, 200),
    (2, 2, 200),
    (3, 2, 250),
    (3, 2, 250),
    (3, 2, 250),
    (3, 2, 250);

INSERT INTO Sellers VALUES
    (1, 'C. Thirdplace'),
    (2, 'A. Firstplace'),
    (3, 'B. Secondplace');

SELECT  s.Name          AS Seller_Name
    ,   x.TotalSales    AS Total_Sales
FROM 
(  
    SELECT      s.SellerID AS SellerID
            ,   SUM(s.Price) AS TotalSales
    FROM        Sales s 
    GROUP BY    s.SellerID 
    WITH ROLLUP
) x
LEFT JOIN   Sellers s 
ON          s.SellerID = x.SellerID;

它产生了以下结果:

SELLER_NAME      TOTAL_SALES
---------------  -----------
C. Thirdplace        300
A. Firstplace        400
B. Secondplace      1000
(null)              1700
1个回答

4
ORDER BY
  CASE WHEN seller_name IS NULL THEN 1 ELSE 0 END,
  seller_name

不错的解决方案!但是如果要求rollup应该是最后一个,那么它不应该是0/1相反吗? - altschuler
@altschuler - 排序自然是升序的。这会将NULL放在最后。 - MatBailie
但是在这里,如果它是汇总行,则按“1,null”排序,如果是其他行,则按“0,<name>”排序,或者我错过了什么? - altschuler
@altschuler - 是的。由于 ORDER BY 默认为 ASC,因此 0, <name> 记录将出现在 1, NULL 记录之前。 - MatBailie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接