我有一个名为
books
的表,列出了书籍的类别和价格,可能是正数或负数(作为销售余额)。
我需要按类别选择所有图书价格的余额,然后按总价格对结果进行排序,正数时使用 DESC
,负数时使用 ASC
。
我首先写下了这个声明:
SELECT
category, SUM(price) AS tot
FROM
books
GROUP BY category
ORDER BY
(CASE WHEN tot > 0 THEN tot END) DESC,
(CASE WHEN tot <= 0 THEN tot END) ASC;
但是
ORDER BY
子句没有按我的预期排序。
所以我用 tot
表达式替换了别名 SUM(price)
,它起作用了:
SELECT
category, SUM(price) AS tot
FROM
books
GROUP BY category
ORDER BY
(CASE WHEN SUM(price) > 0 THEN SUM(price) END) DESC,
(CASE WHEN SUM(price) <= 0 THEN SUM(price) END) ASC;
为什么
ORDER BY
子句不能作用于别名?
并且,考虑到
SUM
聚合函数的多次执行,从性能角度来看,这不是更糟吗?或者是在编译时缓存的?
您首先想要积极的,然后是消极的?
ORDER BY
中的第一个“列”需要拆分案例。
ORDER BY
tot > 0 DESC,
ABS(tot) DESC
tot > 0
为 1 表示正值; 0 表示负数
ABS 的存在是为了使这两种情况都使用 DESC。您希望阳性病例呈下降趋势;通过翻转负例,它们也可以是 DESC。