2010-02-26 5 views
0

J'essaie de créer un rapport contenant un résumé pour chaque groupe. Par exemple:Oracle - Récapitulatifs au niveau du groupe

 
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 

J'ai une requête qui peut tout faire, sauf les colonnes 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 ; 

Je ne suis pas sûr de savoir comment obtenir un résumé sur un groupe. Dans ce cas, j'essaie d'obtenir une somme de COUNT pour chaque groupe d'ID.

MISE À JOUR:

Les groupes sont par type. J'ai oublié cela dans le message original.

TOTAL est SUM (COUNT) pour chaque groupe.

+0

Comment regroupez-vous les choses pour obtenir votre colonne TOTAL? Je ne vois rien dans votre requête qui groupe les ID 1 et 2 ensemble. IOW, pourquoi les ID 1 et 2 dans un groupe, et 7 et 12 dans un autre? Y a-t-il une autre colonne dans vos données qui le fait pour vous? – DCookie

+0

@DCookie: Oups, ouais je groupant pour SUM (COUNT) devrait être par TYPE, pas ID, mis à jour pour montrer que. – FrustratedWithFormsDesigner

+0

Est-ce que cela doit être fait dans SQL * Plus? – DCookie

Répondre

3

Que diriez-vous à l'aide ROLLUP comme ...

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 ;

Cela fonctionne pour un exemple similaire dans ma base de données, mais je ne l'ai fait sur deux colonnes, pas sûr de la façon dont il fonctionne sur plus ...
Espérons que cela est utile,
Craig ...

EDIT: Dans une ROLLUP, les colonnes que vous voulez sommer sur mais pas total partiel sur comme id et data_nam devrait être regroupés dans le ROLLUP dans les parenthèses)

+0

Hehehe ... un timing parfait! Je viens de découvrir ROLLUP il y a une quinzaine de minutes ... Un peu de peaufinage mais j'ai réussi à le faire fonctionner. – FrustratedWithFormsDesigner

+0

+1, illustre bien quelque chose que je n'ai jamais eu l'occasion de regarder ... – DCookie

1

En supposant SQL * Plus, vous pouvez faire quelque chose comme ceci:

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; 

Je ne peux pas faire ce travail dans PL/SQL Developer 8, que SQL * Plus. Pas même la fenêtre de commande fonctionnera ...

0

Essayez une sous-requête qui retourne le nombre de tous les éléments du type. Ce serait

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 ; 
Questions connexes