Oracle - résumés au niveau du groupe
-
23-09-2019 - |
Question
Je suis en train de créer un rapport qui a un résumé pour chaque groupe. Par exemple:
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, je vais essayer d'obtenir une somme de comptage pour chaque groupe d'ID.
Mise à jour:
Les groupes sont par type. Vous avez oublié que le message original.
TOTAL est SUM (COUNT) pour chaque groupe.
La solution
Comment l'utilisation 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'a fait sur deux colonnes, ne sais pas comment il fonctionne sur plus ...
Espérons que cela est utile,
Craig ...
EDIT: Dans un ROLLUP, les colonnes que vous voulez, mais pas la somme sur le sous-total sur comme id et data_nam devraient être regroupées ensemble à l'intérieur du ROLLUP dans paranthèses)
Autres conseils
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 en PL / SQL Developer 8, que SQL * Plus. Pas même la fenêtre de commande fonctionnera ...
Essayez une sous-requête qui renvoie le nombre de tous les éléments du type. Cela
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 ;