Определите общую группу в наборе группировки Postgres - PullRequest
0 голосов
/ 17 июня 2020

Как определить, какая строка является «итоговой» при использовании GROUPING SET?

CREATE TABLE sales (
    product TEXT NOT NULL,
    customer TEXT NOT NULL,
    cost NUMERIC NOT NULL 
);

INSERT INTO sales (product, customer, cost)
VALUES ('Igloo', 'John', 5000)
    , ('Igloo', 'John', 5000)
    , ('Donkey', 'John', 1000)
    , ('Donkey', 'Jane', 1000)
    , ('Mortgage', 'John''s Brother, Jim', 1000);

Я хочу просуммировать продажи по клиентам, продуктам и в целом:

SELECT product, customer, SUM(cost)
FROM sales
GROUP BY GROUPING SETS ((product), (customer), ())
ORDER BY GROUPING(product, customer);

Получение этого результата:

product  customer            sum
-------- ------------------- -----
Donkey   (null)              2000
Igloo    (null)              10000
Mortgage (null)              1000
(null)   Jane                1000
(null)   John                11000
(null)   John's Brother, Jim 1000
(null)   (null)              13000

Я хочу добавить столбец is_total, есть ли способ получить «пустой» набор группировки с помощью GROUPING()? В идеале я бы сделал это, но это недопустимо:

SELECT product
, customer
, sum(cost)
, GROUPING(()) == 0 AS is_total
FROM sales
GROUP BY GROUPING SETS ((product), (customer), ())
ORDER BY GROUPING(product, customer);

Я знаю, что могу это сделать:

SELECT product
, customer
, sum(cost)
, GROUPING(product, customer) = 3 AS is_total
FROM sales
GROUP BY GROUPING SETS ((product), (customer), ())
ORDER BY GROUPING(product, customer);

Но в идеале я бы не стал, поскольку мой запрос очень сложен и группы создаются динамически. Это всего лишь простой пример.

SQLFiddle здесь, если помогает: http://sqlfiddle.com/#! 17 / f5ba5 / 12

1 Ответ

0 голосов
/ 17 июня 2020

Обычно достаточно coalesce():

select coalesce(product, customer, 'Total')

Более формально вы можете использовать grouping():

select (case when grouping(product) = 0 then product
             when grouping(customer) = 0 then customer
             else 'Total'
        end) as the_key
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...