在 SQL 服务器中的别名聚合列上使用 Case 的 Order By 不工​​作

Order By with a Case on an aliased aggregate column in SQL Server not working

目标

我想将 TopOrWorst 和日期范围作为参数传递到存储过程中。它应该 return 根据提供的日期范围内的销售额总和得出的前 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 有什么问题?预先感谢所有帮助。

谢谢

SQL 服务器允许在 ORDER BY 中使用别名 -- 单独使用。

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

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