2014-02-13 10 views
0

比如我有2個表:SQL SUMED了數據與第

用戶

+----+ 
| id | 
+----+ 
| 0 | 
| 1 | 
| 2 | 
| 3 | 
+----+ 

支付

+---------+--------+------+ 
| user_id | amount | case | 
+---------+--------+------+ 
|  0 | 10 | 1 | 
|  0 | 1 | 2 | 
|  2 | 5 | 1 | 
|  2 | 4 | 1 | 
|  2 | 5 | 2 | 
|  3 | 26 | 2 | 
+---------+--------+------+ 

而我試圖讓輸出:

+---------+---------------------+---------------------+ 
| user_id | total_amount_case_1 | total_amount_case_2 | 
+---------+---------------------+---------------------+ 
|  0 |    10 |     1 | 
|  2 |     9 |     5 | 
|  3 |     0 |     26 | 
+---------+---------------------+---------------------+ 

用文字解釋我想選擇每個用戶至少有一次付款,並在分開的情況下彙總其付款金額。

我能得到的地方,我選擇每個用戶的總支付了點,但不依賴於什麼情況下,它是:

SELECT users.id AS user_id, SUM(payments.amount) AS total_amount FROM users LEFT JOIN users.id = payments.user_id GROUP BY user_id ORDER BY user_id; 

這給了我這樣的輸出:

+---------+--------------+ 
| user_id | total_amount | 
+---------+--------------+ 
|  0 |   11 | 
|  1 |   0 | 
|  2 |   14 | 
|  3 |   26 | 
+---------+--------------+ 

回答

0

試試這個

SELECT 
    u.id AS user_id, 
    SUM(CASE WHEN p.`case` = 1 THEN p.amount ELSE 0 END) AS total_amount_case_1, 
    SUM(CASE WHEN p.`case` = 2 THEN p.amount ELSE 0 END) AS total_amount_case_2 
FROM 
    users u 
    LEFT JOIN payments p ON u.id = p.user_id 
GROUP BY u.user_id 
ORDER BY u.user_id ; 
1

你可以使用條件聚合執行此操作 - 在聚合函數中使用case聲明:

SELECT u.id AS user_id, 
     SUM(case when p.`case` = 1 then p.amount else 0 end) AS total_amount_case1, 
     SUM(case when p.`case` = 2 then p.amount else 0 end) AS total_amount_case2 
FROM users u LEFT JOIN 
    payments p 
    on u.id = p.user_id 
GROUP BY user_id 
ORDER BY user_id; 

我還添加了表別名,以減少查詢繁瑣。

0
SELECT users.id AS user_id, 
    SUM(case when Payments.Case = 1 then payments.amount else 0 End) AS total_amount_case1, 
    SUM(case when Payments.Case = 2 then payments.amount else 0 End) AS total_amount_case2 
FROM users LEFT JOIN payments on 
    users.id = payments.user_id 
GROUP BY users.id 
ORDER BY users.id; 
0
SELECT users.id As user_id 
    , Sum(CASE WHEN payments.case = 1 THEN payments.amount ELSE 0 END) As total_amount_case_1 
    , Sum(CASE WHEN payments.case = 2 THEN payments.amount ELSE 0 END) As total_amount_case_2 
FROM users 
LEFT 
    JOIN payments 
    ON users.id = payments.user_id 
GROUP 
    BY user_id 
ORDER 
    BY user_id; 
0

我會做以下線的東西:

SELECT users.id 
,SUM(CASE WHEN payments.[case] = 1 THEN total_amount_case_1 ELSE 0 END) as total_amount_case_1 
,SUM(CASE WHEN payments.[case] = 2 THEN total_amount_case_2 ELSE 0 END) as total_amount_case_2 
FROM users INNER JOIN payments 
ON users.id = payments.user_id 
GROUP BY payments.user_id