如何在PostgreSQL中计算小计

时间:2019-05-09 20:32:59

标签: postgresql subtotal

我有一个这样的桌子

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

试图使用按汇总和分组集。但是总是得到一些重复或空值。

2 个答案:

答案 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)

demo:db<>fiddle

如果您拥有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。这两个结果将被附加。