ORDER BY 子句中的 SQL 双重排序指令不适用于别名

问题描述 投票:0回答:1

我有一个名为

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
聚合函数的多次执行,从性能角度来看,这不是更糟吗?或者是在编译时缓存的?

sql mysql sql-order-by
1个回答
0
投票

您首先想要积极的,然后是消极的?

ORDER BY
中的第一个“列”需要拆分案例。

ORDER BY
    tot > 0  DESC,
    ABS(tot) DESC

tot > 0
为 1 表示正值; 0 表示负数

ABS 的存在是为了使这两种情况都使用 DESC。您希望阳性病例呈下降趋势;通过翻转负例,它们也可以是 DESC。

© www.soinside.com 2019 - 2024. All rights reserved.