сложение и вычитание по типу - PullRequest
0 голосов
/ 12 мая 2018

У меня есть таблица SQLite payments:

+------+--------+-------+
| user | amount | type  |
+------+--------+-------+
| AAA  |  100   | plus  |
| AAA  |  200   | plus  |
| AAA  |  50    | minus |
| BBB  |  100   | plus  |
| BBB  |  20    | minus |
| BBB  |  5     | minus |
| CCC  |  200   | plus  |
| CCC  |  300   | plus  |
| CCC  |  25    | minus |

Мне нужно вычислить сумму с типом «плюс» и вычесть из нее сумму с типом «минус» для каждого пользователя.

Таблица результатов должна выглядеть следующим образом:

+------+--------+
| user | total  | 
+------+--------+
| AAA  |  250   | 
| BBB  |  75    | 
| CCC  |  475   | 

Я считаю, что мой запрос ужасен, и мне нужна помощь для его улучшения:

select user,
(select sum(amount) from payments as TABLE1 WHERE TABLE1.type = 'plus' AND
 TABLE1.user= TABLE3.user) -
 (select sum(amount) from payments as TABLE2 WHERE TABLE2.type = 'minus' AND
TABLE2.user= TABLE3.user) as total
from payments as TABLE3
group by client
order by id asc

1 Ответ

0 голосов
/ 12 мая 2018

Тип легче обрабатывается с помощью выражения CASE .И тогда вы можете объединить агрегирование во внешний запрос:

SELECT user,
       SUM(CASE type
           WHEN 'plus'  THEN amount
           WHEN 'minus' THEN -amount
           END) AS total
FROM payments
GROUP BY client
ORDER BY id;
...