我有一个这样的桌子
ID amout1 amount2 amount3
1 10 0 3
1 20 1 1
2 5 2 2
2 0 3 11
我想为每一列计算小计
ID amout1 amount2 amount3
1 10 0 3
1 20 1 1
sub 30 1 4
2 5 2 2
2 0 3 11
sub 5 5 13
试图使用按汇总和分组集。但是总是得到一些重复或空值。
答案 0 :(得分:2)
一种方法是在另一个查询中进行小计:
WITH sample(id, amount1, amount2, amount3) AS (
VALUES
(1, 10, 0, 3),
(1, 20, 1, 1),
(2, 5, 2, 2),
(2, 0, 3, 11)
)
SELECT *, false AS is_subtotal FROM sample
UNION ALL
SELECT id, sum(amount1), sum(amount2), sum(amount3), true FROM sample GROUP BY id
ORDER BY
id,
is_subtotal;
SQLfiddle here。
答案 1 :(得分:1)
如果您拥有Postgres 9.5或更高版本,则可以使用GROUPING SETS
SELECT
id,
SUM(amount1),
SUM(amount2),
SUM(amount3)
FROM
mytable
GROUP BY GROUPING SETS ((id, amount1, amount2, amount3),(id))
ORDER BY id
GROUPING SETS
功能可以认为是单个UNION
操作的GROUP BY
的简短版本。
因此,此查询对给定的元组执行两个组。第一组在所有列上,因此在这种情况下,所有记录保持唯一。之后,将完成SUM
上的id
。这两个结果将被附加。