SQL: суммирование столбца в несколько столбцов на основе другого столбца - PullRequest
2 голосов
/ 25 февраля 2020

У меня есть таблица в PostgreSQL, которая выглядит примерно так:

Date            Amount      Type
2020-01-10      100         A
2020-01-10      150         B
2020-01-10      120         A
2020-01-10      90          B
2020-01-11      80          B
2020-01-11      120         A
2020-01-11      90          B

Я бы хотел запустить запрос, который бы вывел сумму дней, разделенных на основе на тип, а также вычислить итоговое значение, чтобы он вывел что-то вроде этого

Date            A_Sum       B_Sum       Total
2020-01-10      220         240         460
2020-01-11      120         170         290

Код SQL, который я создал до сих пор, работает, но я считаю его очень неэффективным, поскольку он работает в нескольких подзапросах .

SELECT, q.A_Sum, q.B_Sum, q.A_Sum + q.B_Sum AS Total FROM 
(
 SELECT DISTINCT date,
  (SELECT SUM(amount) FROM table WHERE type='A' AND date=t.date) AS A_Sum,
  (SELECT SUM(amount) FROM table WHERE type='B' AND date=t.date) AS B_Sum
 FROM table t
) q

Есть ли лучший и более эффективный способ получить тот же результат? Как? Как я заметил, выполнение этого запроса обычно занимает значительно больше времени, и я надеялся ускорить его.

1 Ответ

4 голосов
/ 25 февраля 2020

Использовать условное агрегирование - которое в Postgres использует filter:

SELECT date,
       SUM(amount) FILTER (WHERE type = 'A') as a_sum,
       SUM(amount) FILTER (WHERE type = 'B') as b_sum,
       SUM(amount) as total
FROM table t
GROUP BY date;

Неясно, являются ли итоговые значения только "A" и "B". Если так, то:

SELECT date,
       SUM(amount) FILTER (WHERE type = 'A') as a_sum,
       SUM(amount) FILTER (WHERE type = 'B') as b_sum,
       SUM(amount) FILTER (WHERE type IN ('A', 'B')) as total
FROM table t
GROUP BY date;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...