繁体   English   中英

SQL:根据另一列将一列汇总为多列

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM