2010-02-26 5 views
0

Я пытаюсь создать отчет с сводкой для каждой группы. Например: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 для каждой группы ID.

UPDATE:

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

TOTAL SUM (COUNT) для каждой группы.

+0

Как вы группируете вещи, чтобы получить свою колонку TOTAL? Я ничего не вижу в вашем запросе, что группы ID 1 и 2 вместе. IOW, почему идентификаторы 1 и 2 в одной группе, а 7 и 12 в другой? Есть ли еще один столбец в ваших данных, который делает это для вас? – DCookie

+0

@DCookie: Упс, да, я группирую для SUM (COUNT) должен быть ТИП, а не ID, Обновлен, чтобы показать это. – FrustratedWithFormsDesigner

+0

Это должно быть сделано в SQL * Plus? – DCookie

ответ

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 ;

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

EDIT: в ROLLUP, столбцы, которые вы хотите просуммировать, но не промежуточные итоги в течение как идентификатор и data_nam должен быть объединились внутри ROLLUP в скобках)

+0

Hehehe ... идеальное время! Я только что открыл ROLLUP около 15 месяцев назад ... Небольшая настройка, но я получил ее работу. – FrustratedWithFormsDesigner

+0

+1, хорошо иллюстрирует то, что я никогда не имел возможности посмотреть на ... – DCookie

1

Предполагая, что 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. Не даже окно командной строки будет работать ...

0

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

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 ; 
Смежные вопросы