在 SQL Server 中的别名聚合列上按大小写排序不起作用

时间:2021-01-21 17:29:37

标签: sql-server sql-order-by case alias

目标

我想将 TopOrWorst 和日期范围作为参数传递给存储过程。它应该根据提供的日期范围内的销售额总和返回 Top 或 Worst 10 产品。

为了简单起见,我对查询中的日期范围进行了硬编码,并创建了一个变量 @TopOrWorst

以下是 3 个不同的查询,其中后两个有效,但我希望第一个对我有用。

DECLARE @TopOrWorst INT = 1; -- 1 = Top, 2= Worst

-- Query #1: sorting DOES NOT work when the column alias 
-- is used inside the case statement.
SELECT TOP 10 
    sh.Stockcode,
    SUM(sh.SalesValue) AS TotalSales 
FROM 
    SalesHistory sh 
WHERE 
    DateSold BETWEEN '2017-05-05' AND '2017-05-10'
GROUP BY 
    sh.Stockcode
ORDER BY 
    CASE WHEN @TopOrWorst = 1 THEN TotalSales END DESC,
    CASE WHEN @TopOrWorst = 2 THEN TotalSales END  

-- Query #2: sorting works when then column is SUMed inside the case statement.

SELECT TOP 10 
    sh.Stockcode,
    SUM(sh.SalesValue) AS TotalSales 
FROM 
    SalesHistory sh 
WHERE 
    DateSold BETWEEN '2017-05-05' AND '2017-05-10'
GROUP BY 
    sh.Stockcode
ORDER BY 
    CASE WHEN @TopOrWorst = 1 THEN SUM(sh.salesvalue) END DESC,
    CASE WHEN @TopOrWorst = 2 THEN SUM(sh.salesvalue) END  

-- Query #3: sorting works with the Alias field without the case statement.
SELECT TOP 10 
    sh.Stockcode,
    SUM(sh.SalesValue) AS TotalSales 
FROM 
    SalesHistory sh 
WHERE 
    DateSold BETWEEN '2017-05-05' AND '2017-05-10'
GROUP BY 
    sh.Stockcode
ORDER BY 
    TotalSales DESC  

查询#1 有什么问题?提前感谢所有帮助。

谢谢

2 个答案:

答案 0 :(得分:1)

SQL Server 允许在 ORDER BY 中单独使用别名。

SQL Server 不允许别名成为表达式的一部分。像 TotalSales + 1 这样简单的东西也行不通。

答案 1 :(得分:0)

ORDER BY SUM(sh.SalesValue) * CASE WHEN @TopOrWorst = 1 THEN -1 ELSE 1 END