在 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
目标
我想将 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