2012-07-06 9 views
12

Ya leí (this), pero no pude encontrar una manera de implementarlo para mi problema específico. Sé que SUM() es una función agregada y no tiene sentido no usarla como tal, pero en este caso específico, tengo que SUM() todos los resultados mientras mantengo cada fila.Usando SUM() sin agrupar los resultados

Aquí está la tabla:

--ID-- --amount-- 
    1  23 
    2  11 
    3  8 
    4  7 

necesito SUM() la cantidad, pero mantener todos los registros, por lo que la salida debería ser como:

--ID-- --amount-- 
    1  49 
    2  49 
    3  49 
    4  49 

tuve esta consulta, pero sólo sumas cada fila, no todos los resultados juntos:

SELECT 
    a.id, 
    SUM(b.amount) 

FROM table1 as a 
JOIN table1 as b ON a.id = b.id 
GROUP BY id 

sin la SUM() i t solo devolvería una sola fila, pero necesito mantener todos los ID ...

Nota: Sí, este es un ejemplo bastante básico y podría usar php para hacer esto aquí, pero obviamente la tabla es más grande y tiene más filas y columnas, pero ese no es el punto.

Respuesta

12
SELECT a.id, b.amount 
FROM table1 a 
CROSS JOIN 
(
    SELECT SUM(amount) amount FROM table1 
) b 

que debe realizar un cartesian join del valor de la suma de cada fila de la tabla para cada id. Como solo hay un resultado de la subselección (49), básicamente se pega en cada id.

+0

Genius! Gracias por eso :) – Anonymous

5

Únete a la tabla original a la suma con una subconsulta:

SELECT * FROM table1, (SELECT SUM(amount) FROM table1 AS amount) t 
+0

@Bohemian, mirada más cercana, la subconsulta no está en la cláusula 'SELECT' pero es de hecho parte de la cláusula 'FROM' que crea un producto cartesiano. Solo se ejecuta una vez. –

+0

@ZaneBien derecha - borré mi comentario – Bohemian

0

Esto no sólo una sum() consulta, por lo que debe realizar OK:

SELECT a.id, b.amount 
FROM table1 a 
cross join (SELECT SUM(amount) as amount FROM table1 AS amount) b 
5

con MS SQL puede utilizar una()

select id, SUM(amount) OVER() 
from table1 



select id, SUM(amount) OVER() 
from (
    select 1 as id, 23 as amount 
    union all 
    select 2 as id, 11 as amount 
    union all 
    select 3 as id, 8 as amount 
    union all 
    select 4 as id, 7 as amount 
) A 

enter image description here

--- MÁS DE REPARTO ID
PARTICIÓN POR la ​​cual es muy útil cuando quiere hacer SUM() por MES por ejemplo o hacer informes de ventas trimestrales s o anual ... (Nota distintas necesidades que está haciendo para todas las filas)

select distinct id, SUM(amount) OVER(PARTITION BY id) as [SUM_forPARTITION] 
from (
    select 1 as id, 23 as amount 
    union all 
    select 1 as id, 23 as amount 
    union all 
    select 2 as id, 11 as amount 
    union all 
    select 2 as id, 11 as amount 
    union all 
    select 3 as id, 8 as amount 
    union all 
    select 4 as id, 7 as amount 
) OverPARTITIONID 

enter image description here

+0

Debo estar equivocado, pero ¿escribiste seriamente cada valor de la base de datos? Eso no es muy programático y, por lo tanto, no es muy útil. – Anonymous

+0

es un ejemplo, puede reemplazar "FROM (...) con su consulta compleja ... El segundo ejemplo es con PARTITION BY que es muy útil cuando quiere hacer SUM() por MES, por ejemplo –

Cuestiones relacionadas