2016-07-29 52 views
1

考虑下面的代码:如何计算两个别名的差异进行排序

SELECT SUM(w.valor), 
SUM(CASE WHEN w.tipo = '+' THEN w.valor ELSE 0 END) AS total_credit, 
SUM(CASE WHEN w.tipo = '-' THEN w.valor ELSE 0 END) AS total_debit, 
w.clientUNIQUE, 
c.client as cclient 
FROM wallet AS w 
LEFT JOIN clients AS c ON w.clientUNIQUE = c.clientUNIQUE 
WHERE w.status='V' 
GROUP BY w.clientUNIQUE 
ORDER BY total_credit-total_debit 

我试图计算排序目的的两个别名计算值之差,但我发现了以下错误:

Reference 'total_credit' not supported (reference to group function)

我在做什么错误,我如何使用两个别名之间的差值来排序结果?

+1

有在哪里/当你可以用这样的别名限制。这是其中之一。你必须将整个别名表达式复制到'order by'中。或者可能包裹另一个查询,并订购“元”结果。 –

+0

您的提示将别名表达式复制到表达式的顺序中,显示了我解决这个问题的正确方法。非常感谢您的帮助。我想赞扬你,但是我不可能这样做,因为这是一个评论。 –

+0

你确定这是MySQL吗?在ORDER BY子句中使用别名时,MySQL通常没有问题,在MS SQL(不确定Oracle)中,不能使用别名并且必须重复表达式。 – Uueerdo

回答

3

您无法通过自己的别名在同一个选择表达式引用列,所以有2个选项...在order by

重复表达式(议员):

ORDER BY 
    SUM(CASE WHEN w.tipo = '+' THEN w.valor ELSE 0 END) AS total_credit - 
    SUM(CASE WHEN w.tipo = '-' THEN w.valor ELSE 0 END) AS total_debit 

或者更容易对大脑和更容易通过子查询维持(DRY),顺序为:

select * from (
    <your query without the ORDER BY> 
) q 
ORDER BY total_credit - total_debit 
相关问题