Oracle — сводки на уровне группы

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

ID           NAME              COUNT           TOTAL     TYPE
-------------------------------------------------------------
1            Test 1            10                         A
2            Test 2            8                          A
                                               18

7            Mr. Test          9                          B
12           XYZ               4                          B
                                               13

25           ABC               3                          C
26           DEF               5                          C
19           GHIJK             1                          C
                                               9

У меня есть запрос, который может делать все, кроме столбцов TOTAL:

       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 для каждой группы идентификаторов.

ОБНОВЛЕНИЕ:

Группы по типу. Забыл это в исходном посте.

ИТОГО — это СУММА (СЧЁТ) для каждой группы.


person FrustratedWithFormsDesigner    schedule 26.02.2010    source источник
comment
Как вы группируете данные, чтобы получить столбец «ИТОГО»? Я не вижу ничего в вашем запросе, который группирует ID 1 и 2 вместе. IOW, почему ID 1 и 2 в одной группе, а 7 и 12 в другой? Есть ли в ваших данных другой столбец, который делает это за вас?   -  person DCookie    schedule 26.02.2010
comment
@DCookie: Упс, да, я группирую для SUM(COUNT) по ТИПУ, а не по ID, обновлено, чтобы показать это.   -  person FrustratedWithFormsDesigner    schedule 26.02.2010
comment
Это нужно сделать в SQL*Plus?   -  person DCookie    schedule 26.02.2010
comment
@DCookie: наверное. Сейчас я работаю в PL/SQL Developer, я хочу, чтобы эти отчеты генерировались и экспортировались одним нажатием кнопки. Все для этого уже есть, кроме запроса!   -  person FrustratedWithFormsDesigner    schedule 26.02.2010


Ответы (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 ;

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

РЕДАКТИРОВАТЬ: в ROLLUP столбцы, которые вы хотите суммировать, но не промежуточные итоги, такие как id и data_nam, должны быть объединены внутри ROLLUP в круглых скобках)

person Craig    schedule 26.02.2010
comment
Хе-хе... идеальное время! Я только что открыл для себя ROLLUP около 15 минут назад... Немного подправил, но у меня все заработало. - person FrustratedWithFormsDesigner; 26.02.2010

Предполагая, что 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. Даже командное окно не работает...

person DCookie    schedule 26.02.2010

Попробуйте подзапрос, который возвращает количество всех элементов типа. Это бы

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 ;
person Matthew Flynn    schedule 26.02.2010