2010-06-10 33 views
4

J'ai un tableau simplifié xx comme suit:Comment obtenez-vous la moyenne des sommes dans SQL (agrégation multi-niveau)?

rdate date 
rtime time 
rid integer 
rsub integer 
rval integer 
primary key on (rdate,rtime,rid,rsub) 

et je veux obtenir la moyenne (dans tous les temps) des sommes (dans tous les IDs) des valeurs.

A titre d'exemple de table, j'ai (avec des valeurs identiques consécutives obturées pour la lisibilité):

rdate  rtime  rid rsub rval 
------------------------------------- 
2010-01-01 00.00.00 1  1 10 
           2 20 
         2  1 30 
           2 40 
      01.00.00 1  1 50 
           2 60 
         2  1 70 
           2 80 
      02.00.00 1  1 90 
           2 100 
2010-01-02 00.00.00 1  1 999 

je peux obtenir les sommes que je veux avec:

select rdate,rtime,rid, sum(rval) as rsum 
from xx 
where rdate = '2010-01-01' 
group by rdate,rtime,rid 

qui me donne :

rdate  rtime  rid rsum 
------------------------------- 
2010-01-01 00.00.00 1 30 (10+20) 
         2 70 (30+40) 
      01.00.00 1 110 (50+60) 
         2 150 (70+80) 
      02.00.00 1 190 (90+100) 

comme prévu.

Maintenant ce que je veux est la requête qui sera en moyenne également ces valeurs dans la dimension temporelle, me donner:

rdate  rtime ravgsum 
---------------------------- 
2010-01-01 00.00.00  50 ((30+70)/2) 
      01.00.00  130 ((110+150)/2) 
      02.00.00  190 ((190)/1) 

J'utilise DB2 pour z/OS, mais je préfère la norme SQL si possible .

Répondre

4
select rdate,rtime,avg(rsum) as ravgsum from (
    select rdate,rtime,rid, sum(rval) as rsum 
    from xx 
    where rdate = '2010-01-01' 
    group by rdate,rtime,rid 
) as subq 
group by rdate,rtime 
+0

Je ne reçois pas de lignes retournées de cela, et j'étais sur le point de se plaindre amèrement quand je remarqué que vous aviez mis en '2010-06-01' pour une raison au lieu de 2010-01-01. Et puis j'ai remarqué que j'avais fait la même chose dans la question :-) D'Oh! Une fois que j'ai résolu cela (dans la question et toutes les réponses à ce jour), cela a bien fonctionné. – paxdiablo

+0

Haha, heureuses choses ont fonctionné à la fin. :) – Amber

1

Que diriez-vous

select rdate,rtime, sum(rsum)/count(rsum) as sumavg 
from 
(select rdate, rtime, rid, sum(rval) as rsum 
from xx 
where rdate = '2010-01-01' 
group by rdate,rtime,rid) as subq 
group by rdate,rtime 
+0

+1 pour aider, mais je ne peux m'empêcher de penser que la moyenne serait meilleure que la somme/le nombre. Cela fonctionne toujours, alors merci. – paxdiablo