2014-04-08 16 views
0

我有一个表格数据和状态的交易。有三种状态批准,无效和取消。我想这样的,这将出来把如下查询:显示两种状态数量的总和

approved cancelled void 
$123  $144  $155 

其中$ 123 $ 144和$ 155的状态定义的总量各种交易的总和。

请帮帮我。

+0

你有一个表或更好的解释是一种很难知道你想要什么 – user3210416

+0

确定我要的是下批准的列总和(金额)所有经批准的交易,下的所有交易取消的取消总和(金额)等等 – user1140176

+0

考虑处理应用程序级别的数据显示问题。否则,看看构造一个数据透视查询。 – Strawberry

回答

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()集合体只是操作上的表达,像它总是这样。

随访

Q如果有什么其他的与其他类型的交易状态,但我想在一列中显示的其他状态的总和?

一个同样,只使用该值为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 ... 
+0

非常抱歉再次打扰您如果有其他事务处于其他类型的状态,但我想在一列中显示其他状态的总和 – user1140176

+1

您可以使用相同的语法添加另一个结果列,这是所有行的总和('批准','取消','空白')中的t.status – RobP