Oracle - сводки на уровне группы
Я пытаюсь создать отчет, в котором есть резюме для каждой группы. Например:
ИМЯ ИМЯ СЧЕТА ВСЕГО ТИПА --------------------------------------------- ---------------- 1 Испытание 1 10 A 2 Испытание 2 8 A 18 7 Г-н Испытание 9 B 12 XYZ 4 B 13 25 ABC 3 C 26 DEF 5 C 19 GHIJK 1 C 9
У меня есть запрос, который может сделать все, кроме ВСЕГО столбцов:
select sd.id DATA_REF_NUM ID, count(sd.DATA_DEF_ID) COUNT, defs.data_name NAME, sd.type
from some_data sd, data_defs defs
where sd.data_def_id = defs.data_def_id
group by some_data.type, some_data.id, defs.data_nam
order by some_data.id asc, count(amv.MSG_ID) desc ;
Я просто не знаю, как получить резюме по группе. В этом случае я пытаюсь получить сумму COUNT для каждой группы идентификаторов.
ОБНОВИТЬ:
Группы по типу. Забыл это в оригинальном посте.
ВСЕГО СУММА (COUNT) для каждой группы.
3 ответа
Как насчет использования ROLLUP, как...
select sd.id DATA_REF_NUM ID, count(sd.DATA_DEF_ID) COUNT, defs.data_name NAME, sd.type
from some_data sd, data_defs defs
where sd.data_def_id = defs.data_def_id
group by ROLLUP(some_data.type, (some_data.id, defs.data_nam))
order by some_data.id asc, count(amv.MSG_ID) desc ;
Это работает для аналогичного примера в моей базе данных, но я сделал это только для двух столбцов, не зная, как он будет работать более...
Надеюсь, это полезно,
Craig...
РЕДАКТИРОВАТЬ: В ROLLUP столбцы, которые вы хотите суммировать, но не промежуточные итоги, такие как id и data_nam, должны быть объединены в ROLLUP в параграфах)
Предполагая SQL*Plus, вы можете сделать что-то вроде этого:
col d1 noprint
col d2 noprint
WITH q AS
(SELECT sd.id, count(sd.DATA_DEF_ID) COUNT, defs.data_name NAME, sd.type
FROM some_data sd JOIN data_defs defs ON (sd.data_def_id = defs.data_def_id)
GROUP BY some_data.type, some_data.id, defs.data_nam)
SELECT 1 d1, type d2, id, count, name FROM q
UNION ALL
SELECT 2, type, null, null, null, SUM(count) FROM q GROUP BY 2, type
ORDER BY 2,1,3;
Я не могу заставить это работать в PL/SQL Developer 8, только SQL*Plus. Даже командное окно не будет работать...
Попробуйте подзапрос, который возвращает количество всех элементов типа. Это будет
select sd.id DATA_REF_NUM ID, count(sd.DATA_DEF_ID) COUNT, tot.TOTAL_FOR_TYPE, defs.data_name NAME, sd.type
from some_data sd, data_defs defs,
(select count(sd2.DATA_DEF_ID) TOTAL_FOR_TYPE
from some_data sd2
where sd2.type = sd.type) tot
where sd.data_def_id = defs.data_def_id
group by some_data.type, some_data.id, defs.data_nam
order by some_data.id asc, count(amv.MSG_ID) desc ;