2009-10-04 174 views
3

設置:MySQL查詢相關問題:

mysql> create table bank(bank_id integer, bank_name varchar(255)); 
Query OK, 0 rows affected (0.27 sec) 

mysql> create table accounts_bank(method tinyint, bank_id integer, amount float); 
Query OK, 0 rows affected (0.09 sec) 

mysql> insert into bank(bank_id, bank_name) values(1, 'A Bank'); 
Query OK, 1 row affected (0.05 sec) 

mysql> insert into bank(bank_id, bank_name) values(2, 'B Bank'); 
Query OK, 1 row affected (0.03 sec) 

mysql> insert into bank(bank_id, bank_name) values(3, 'C Bank'); 
Query OK, 1 row affected (0.03 sec) 

mysql> insert into bank(bank_id, bank_name) values(4, 'D Bank'); 
Query OK, 1 row affected (0.03 sec) 

mysql> inseert into accounts_bank(method, bank_id, amount) values (0, 1, 2500); 
Query OK, 1 row affected (0.03 sec) 

mysql> inseert into accounts_bank(method, bank_id, amount) values (1, 2, 2500); 
Query OK, 1 row affected (0.03 sec) 

mysql> inseert into accounts_bank(method, bank_id, amount) values (1, 3, 5000); 
Query OK, 1 row affected (0.03 sec) 

mysql> inseert into accounts_bank(method, bank_id, amount) values (0, 4, 500); 
Query OK, 1 row affected (0.05 sec) 

mysql> inseert into accounts_bank(method, bank_id, amount) values (0, 4, 5800); 
Query OK, 1 row affected (0.03 sec) 

mysql> inseert into accounts_bank(method, bank_id, amount) values (1, 3, 25000); 
Query OK, 1 row affected (0.02 sec) 

mysql> inseert into accounts_bank(method, bank_id, amount) values (0, 2, 27500); 
Query OK, 1 row affected (0.03 sec) 

mysql> inseert into accounts_bank(method, bank_id, amount) values (0, 1, 2000); 
Query OK, 1 row affected (0.03 sec) 

mysql> inseert into accounts_bank(method, bank_id, amount) values (0, 1, 2500); 
Query OK, 1 row affected (0.03 sec) 

mysql> inseert into accounts_bank(method, bank_id, amount) values (1, 2, 2500); 
Query OK, 1 row affected (0.03 sec) 

mysql> inseert into accounts_bank(method, bank_id, amount) values (0, 4, 2500); 
Query OK, 1 row affected (0.03 sec) 

我的第一個查詢:

mysql> select bank_name, sum(amount) as amount from accounts_bank ab left join bank b on b.bank_id=ab.bank_id where method=0 group by bank_name order by bank_name; 

回報:

+-----------+--------+ 
| bank_name | amount | 
+-----------+--------+ 
| A Bank | 7000 | 
| B Bank | 27500 | 
| D Bank | 8800 | 
+-----------+--------+ 
3 rows in set (0.00 sec) 

我的第二個查詢:

mysql> select bank_name, sum(amount) as amount from accounts_bank ab left join bank b on b.bank_id=ab.bank_id where method=1 group by bank_name order by bank_name; 

個回報:

+-----------+--------+ 
| bank_name | amount | 
+-----------+--------+ 
| B Bank | 5000 | 
| C Bank | 30000 | 
+-----------+--------+ 
2 rows in set (0.00 sec) 

現在我想這樣的結果通過簡單地從第一個扣除2日的結果:

+-----------+--------+ 
| bank_name | amount | 
+-----------+--------+ 
| A Bank | 7000 | 
| B Bank | 22500 | 
| C Bank | -30000 | 
| D Bank | 8800 | 
+-----------+--------+ 

爲了得到這樣的結果,我應該跑什麼MySQL查詢?

回答

4
select subquery.bank_name, sum(subquery.amount) from 
    (
    select bank_name, sum(amount) as amount from accounts_bank ab left join bank b on 
     b.bank_id=ab.bank_id where method=0 group by bank_name 
    union all 
    select bank_name, sum(-amount) as amount from accounts_bank ab left join bank b on 
     b.bank_id=ab.bank_id where method=1 group by bank_name 
    ) as subquery group by subquery.bank_name order by subquery.bank_name
+0

絕對正確。非常感謝您的幫助。 – Tareq 2009-10-04 07:07:15

2

可以使用CASE表達式在這種情況下:

SELECT 
    bank_name, 
    sum(CASE WHEN method=0 THEN amount WHEN method=1 THEN -amount ELSE 0 END) AS amount 
FROM accounts_bank ab 
    LEFT JOIN bank b ON b.bank_id=ab.bank_id 
GROUP BY bank_name 
ORDER BY bank_name 

如果你需要一些更復雜的處理,你可以簡單地將二者結合起來的查詢是這樣的:

SELECT bank_name, sum(amount) AS amount 
FROM 
    (SELECT bank_id, sum(amount) as amount 
    FROM accounts_bank WHERE method=1 
    UNION 
    SELECT bank_id, -sum(amount) as amount 
    FROM accounts_bank WHERE method=0) ab 
    LEFT JOIN bank b ON b.bank_id=ab.bank_id 
GROUP BY bank_name 
ORDER BY bank_name 
+0

您的第一個查詢運行良好,但第二個查詢顯示錯誤。不過,非常感謝給我正確的答案。 – Tareq 2009-10-04 07:09:58

+0

用sum(amount)替換sum(t),我在不同的表格中測試了它,並忘記更改它。 – 2009-10-04 07:12:51

0

我請注意,您正在爲所有銀行設置「bank_id」= 1。他們不應該是不同的數字嗎?這可能是你的問題的一部分。

+0

對不起,這是我的打字錯誤。現在糾正了。 – Tareq 2009-10-04 07:05:33