Как рассчитать промежуточный итог в postgreSQL - PullRequest
0 голосов
/ 09 мая 2019

У меня есть такая таблица

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 ]

2 голосов
/ 09 мая 2019

Одним из способов является подытог в другом запросе, например:

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 здесь .

1 голос
/ 10 мая 2019

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

The *Функцию 1010 * можно представить как короткую версию UNION отдельных операций GROUP BY.

Поэтому этот запрос выполняет две группы по заданным кортежам.Первая группа находится над всеми столбцами, поэтому в этом случае все записи остаются уникальными.После этого будет SUM over id.Оба результата будут добавлены.

...