目标
我想将 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 有什么问题?提前感谢所有帮助。
谢谢
答案 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