2009-10-08 18 views
5

Supponiamo di avere questa tabellaSELECT SUM come campo

tabella (a, b, c, d). I tipi di dati non sono importanti.

io voglio fare questo

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 

... ma non riesco a trovare un modo (sqldeveloper continua a lamentarsi con "dalla clausola di non trovato".)

Esiste un modo? È possibile?

+0

Grazie ragazzi. Ho ottenuto molto più di quanto stavo cercando, e so che leggerò su PARTITION e OVER. Questo è quello che mi piace di SO. – Tom

+0

questo è "ora leggerò ..." – Tom

risposta

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 

E 'molto più semplice ed efficace per riscriverlo come questo:

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, 

Annotare la SUM(SUM(d)) qui.

Il numero più interno SUM è la funzione di aggregazione. Calcola il valore a-b-c -wise.

Il più esterno SUM è la funzione analitica. Indica il valore calcolato in anticipo di a-b e restituisce il valore insieme a ciascuna riga.

2

Intendi qualcosa del genere?

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

Cosa ti compra "OVER (PARTITION BY a, b)"? Questo non funziona senza quella parte della dichiarazione? – Jay

+0

No. La clausola OVER in combinazione con PARTITION BY divide il set di risultati in diverse partizioni e quindi applica la funzione di aggregazione a queste partizioni. Per ulteriori informazioni, leggere http://msdn.microsoft.com/en-us/library/ms189461.aspx. –

+0

Hai bisogno di un 'SUM (SUM (d))' qui. – Quassnoi

1

si può fare con gli 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