我有一个包含列数量和状态的表事务。有三种状态已批准,无效和已取消。我想要这样一个查询,如下所示:
approved cancelled void
$123 $144 $155
其中$ 123,$ 144和$ 155是状态定义的每种交易总额的总和。
请帮帮我。
答案 0 :(得分:2)
一种选择是在聚合内部使用条件表达式,如下所示:
SELECT SUM(IF(t.status='approved' ,t.amount,0) AS approved
, SUM(IF(t.status='cancelled',t.amount,0) AS cancelled
, SUM(IF(t.status='void' ,t.amount,0) AS void
FROM mytable t
WHERE ...
注意 IF()
函数将第一个参数计算为布尔值;如果第一个参数的计算结果为TRUE,则该函数返回第二个参数,否则返回第三个参数。
SUM()
是标准的聚合函数;在这个例子中,它只是在一个表达式上运行,就像它在任何表达式上运行一样。
IF()
函数是MySQL特有的。 ANSI标准等价物:
SELECT SUM(CASE WHEN t.status='approved' THEN t.amount ELSE 0 END) AS approved
, SUM(CASE WHEN t.status='cancelled' THEN t.amount ELSE 0 END) AS cancelled
, SUM(CASE WHEN t.status='void' THEN t.amount ELSE 0 END) AS AS void
FROM mytable t
WHERE ...
同样,SUM()
聚合只是在表达式上运行,就像它一直一样。
<强>后续强>
问如果还有其他类型状态的其他交易,但我想在一列中显示其他状态的总和怎么办?
A 再次,只需在要返回金额值的每一行上使用一个评估为TRUE的表达式;有时反转测试更方便,以便为else条件返回金额,而不是那时,例如。
SELECT SUM(IF(t.status='approved' ,t.amount,0) AS approved
, SUM(IF(t.status='cancelled',t.amount,0) AS cancelled
, SUM(IF(t.status='void' ,t.amount,0) AS void
, SUM(IF(t.status IN ('approved','cancelled','void'), 0, t.amount) AS others
FROM mytable t
WHERE ...