显示两种状态的金额总和

时间:2014-04-08 16:26:41

标签: mysql

我有一个包含列数量和状态的表事务。有三种状态已批准,无效和已取消。我想要这样一个查询,如下所示:

approved cancelled void 
$123     $144      $155

其中$ 123,$ 144和$ 155是状态定义的每种交易总额的总和。

请帮帮我。

1 个答案:

答案 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 ...