2009-10-04 9 views
3

:MySQL Query relatives à l'installation Problème

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) 

ma première requête:

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; 

retours:

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

ma seconde requête:

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; 

retours:

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

Maintenant, je veux un résultat comme celui-ci en déduisant simplement 2ème résultat de la 1ère:

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

Pour obtenir ce résultat que la requête mysql dois-je exécuter?

Répondre

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

absolument correct. merci beaucoup de m'avoir aidé. – Tareq

2

Vous pouvez utiliser l'expression CASE dans ce cas:

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 

Si vous avez besoin d'un traitement plus complexe, vous pouvez simplement combiner les deux requêtes comme ceci:

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

Votre première requête s'exécute bien mais la seconde affiche une erreur. Merci beaucoup de m'avoir donné la bonne réponse. – Tareq

+0

Remplacer la somme (t) par la somme (montant), je l'ai testé dans différentes tables et j'ai oublié de changer cela. –

0

I remarquez que vous définissez 'bank_id' = 1 pour toutes les banques. Ne devraient-ils pas être des nombres différents? Cela pourrait faire partie de votre problème.

+0

désolé c'était mon erreur de frappe. maintenant corrigé. – Tareq