[英]SQL SUM multiple columns and match based on multiple values in one column
[英]SQL: Sum a column into multiple columns based on another column
我在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
有没有更好更有效的方法来获得相同的输出? 如何? 正如我确实注意到运行此查询往往需要更长的时间,我希望加快速度。
使用条件聚合——在 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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.