2009-10-08 9 views
5

Supongamos que tengo esta tablaSELECCIONAR SUM como campo

tabla (a, b, c, d). Los tipos de datos no son importantes.

quiero hacer esto

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 

... pero no puedo encontrar una manera (sqldeveloper mantiene quejándose con "de la cláusula no encontrado".)

¿Hay alguna manera? ¿Es posible?

+0

Gracias chicos. Obtuve mucho más de lo que estaba buscando, y sé que leeré sobre PARTITION y OVER. Esto es lo que me gusta de SO. – Tom

+0

eso es "ahora voy a leer ..." – Tom

Respuesta

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 

Es mucho más simple y eficiente para volver a escribir como la siguiente:

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, 

Nota del SUM(SUM(d)) aquí.

La SUM más interna es la función de agregado. Calcula el SUM(d)a-b-c -wise.

La más externa SUM es la función analítica. Suma el valor SUM(d) pre calculado a-b -wise, y devuelve el valor junto con cada fila.

2

¿Quieres decir algo como esto?

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é significa "OVER (PARTITION BY a, b)" buy you? ¿Esto no funciona sin esa parte de la declaración? – Jay

+0

No. La cláusula OVER en conjunción con PARTITION BY divide el conjunto de resultados en varias particiones y luego aplica la función de agregado a estas particiones. Para obtener más información, lea http://msdn.microsoft.com/en-us/library/ms189461.aspx. –

+0

Necesita un 'SUM (SUM (d))' aquí. – Quassnoi

1

puede hacerlo con los 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