Использование ROLLUP для сложения сумм в последней строке

У меня есть таблица с данными ниже. Вот код:

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

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
0
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Сначала суммируйте по 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);

Что для примера данных выводит:

ИДЕНТИФИКАТОР ЯН ФЕВРАЛЬ МАР АПРЕЛЬ МОЖЕТ ИЮНЬ ОБЩИЙ 1006 0 0 0 1 0 0 1 10618 0 0 0 0 1 0 1 9999 0 2 0 0 0 0 2 1000 0 0 0 0 9 0 9 13071 0 0 0 0 8 0 8 1009 0 0 0 0 11 0 11 15344 0 0 0 0 1 0 1 14337 0 0 0 0 1 0 1 990 0 0 0 0 1 0 1 10907 0 0 0 0 1 0 1 нулевой 0 2 0 1 33 0 36

рабочий пример

Я хочу упорядочить по общему убыванию, но хочу, чтобы суммы были в последней строке. Как мне это сделать? И можно ли сделать весь выбор в одном запросе, не используя MAX(mon), а просто mon?

hajduk 28.05.2024 13:48

@hajduk Добавьте ORDER BY GROUPING_ID(id), total, idскрипку. Все это в одном запросе; внутренний SELECT создает встроенное представление, которое используется внешним SELECT, поэтому ему нужно запросить таблицу только один раз.

MT0 28.05.2024 16:14

Я понимаю. Спасибо. Но я имею в виду, можно ли это сделать и без внутреннего запроса?

hajduk 28.05.2024 16:49

Другие вопросы по теме