У меня есть таблица с данными ниже. Вот код:
create table t(mon number, id number)
insert into t(mon, id)
SELECT 4, 1006 FROM DUAL UNION ALL
SELECT 5, 10618 FROM DUAL UNION ALL
SELECT 2, 9999 FROM DUAL UNION ALL
SELECT 2, 9999 FROM DUAL UNION ALL
SELECT 2, 1000 FROM DUAL UNION ALL
Я хочу добавить суммы в последней строке. Я попробовал с этим запросом:
select id,
coalesce(case when max(mon) = 1 then count(*) end, 0) Jan,
coalesce(case when max(mon) = 2 then count(*) end, 0) Feb,
coalesce(case when max(mon) = 3 then count(*) end, 0) Mar,
coalesce(case when max(mon) = 4 then count(*) end, 0) Apr,
coalesce(case when max(mon) = 5 then count(*) end, 0) May,
coalesce(case when max(mon) = 6 then count(*) end, 0) Jun,
count(*) from t group by rollup(id);
Но я получаю:
0 0 0 0 36 0 36
Я желаю получить:
0 2 0 1 33 0 36
Вся таблица с данными находится в БД Fiddle


Сначала суммируйте по id, а затем выполните ROLLUP, чтобы получить итоговые значения (если вы попытаетесь сделать все это за один раз, то в строке ROLLUP будет использоваться глобальный максимум, а не максимум для каждого id).
SELECT id,
SUM(CASE max_mon WHEN 1 THEN total ELSE 0 END) AS Jan,
SUM(CASE max_mon WHEN 2 THEN total ELSE 0 END) AS Feb,
SUM(CASE max_mon WHEN 3 THEN total ELSE 0 END) AS Mar,
SUM(CASE max_mon WHEN 4 THEN total ELSE 0 END) AS Apr,
SUM(CASE max_mon WHEN 5 THEN total ELSE 0 END) AS May,
SUM(CASE max_mon WHEN 6 THEN total ELSE 0 END) AS Jun,
SUM(total) AS total
FROM (
SELECT id,
MAX(mon) AS max_mon,
COUNT(*) AS total
FROM t
GROUP BY id
)
GROUP BY ROLLUP(id);
Что для примера данных выводит:
@hajduk Добавьте ORDER BY GROUPING_ID(id), total, idскрипку. Все это в одном запросе; внутренний SELECT создает встроенное представление, которое используется внешним SELECT, поэтому ему нужно запросить таблицу только один раз.
Я понимаю. Спасибо. Но я имею в виду, можно ли это сделать и без внутреннего запроса?
Я хочу упорядочить по общему убыванию, но хочу, чтобы суммы были в последней строке. Как мне это сделать? И можно ли сделать весь выбор в одном запросе, не используя MAX(mon), а просто mon?