2014-04-08 53 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