Как определить, какая строка является «итоговой» при использовании 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