Проблема, связанная с запросом MySQL - PullRequest
3 голосов
/ 04 октября 2009

настройка:

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) 

Теперь я хочу получить такой результат, просто вычтя второй результат из первого:

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

Чтобы получить этот результат, какой запрос mysql я должен выполнить?

Ответы [ 3 ]

4 голосов
/ 04 октября 2009
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
2 голосов
/ 04 октября 2009

Вы можете использовать выражение 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 голосов
/ 04 октября 2009

Я заметил, что вы устанавливаете 'bank_id' = 1 для всех банков. Разве они не должны быть разными числами? Это может быть частью вашей проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...