2009-10-08 7 views
5

Supposons que j'ai cette tableSELECT SUM comme champ

table (a, b, c, d). Les types de données ne sont pas importants.

Je veux faire

select a as a1,b as b1,c as c1, 
     (select sum(d) from table where a=a1 and b=b1) as total 
from table 
group by a,b,c 

... mais je ne peux pas trouver un moyen (sqldeveloper continue se plaindre avec "de clause not found".)

Est-il possible? C'est possible?

+0

Merci les gars. J'ai eu beaucoup plus que ce que je cherchais, et je sais que je vais lire à propos de PARTITION et plus. C'est ce que j'aime à propos de SO. – Tom

+0

thats "maintenant je vais lire ..." – Tom

Répondre

8
SELECT a as a1,b as b1,c as c1, 
     (
     SELECT SUM(d) 
     FROM mytable mi 
     WHERE mi.a = mo.a 
       AND mi.b= mo.b 
     ) as total 
FROM mytable 
GROUP BY 
     a, b, c 

Il est beaucoup plus simple et efficace de réécrire comme ceci:

SELECT a AS a1, B AS b1, c AS c1, SUM(SUM(d)) OVER (PARTITION BY a, b) AS total 
FROM mytable 
GROUP BY 
     a, b, 

Notez le SUM(SUM(d)) ici.

La fonction la plus interne est SUM. Il calcule le SUM(d)a-b-c -wise.

Le SUM le plus à l'extérieur est la fonction analytique. Il calcule le a-bSUM(d) précalculé et renvoie la valeur avec chaque ligne.

2

Vous voulez dire quelque chose comme ça?

select a as a1, 
     b as b1, 
     c as c1, 
     sum(sum(d)) OVER (PARTITION BY a, b) AS total 
from table 
group by a,b,c 
+0

Qu'est-ce que "OVER (PARTITION PAR a, b)" vous achetez? Cela ne fonctionne-t-il pas sans cette partie de la déclaration? – Jay

+0

Non. La clause OVER en conjonction avec PARTITION BY divise le jeu de résultats en plusieurs partitions, puis applique la fonction d'agrégat à cette partition. Pour plus d'informations, consultez http://msdn.microsoft.com/en-us/library/ms189461.aspx. –

+0

Vous avez besoin d'un 'SUM (SUM (d))' ici. – Quassnoi

1

vous pouvez le faire avec des alias:

SELECT a AS a1, b AS b1, c AS c1, 
     (SELECT SUM(d) 
      FROM test_t t_in 
      WHERE t_in.a = t.a 
      AND t_in.b = t.b) AS total 
    FROM test_t t 
GROUP BY a, b, c