2012-10-12 201 views
6

así que tengo una tabla como la siguiente:Sum varias filas

id mod n1 n2 n3 
1  1  1  1 
1  2   2 
1  3     3 
2  1  1 
2  2   2 
3  1  1 

Y quiero resumir cada valor para todas las filas de un ID específico en un total de llamadas columna, pero no quieren agrupe la identificación juntos porque tienen un número de mod diferente. Quiero un resultado como este:

id mod total 
1  1  7 
1  2  7 
1  3  7 
2  1  3 
2  2  3 
3  1  1 

no puedo usar por grupo, ya que me dará el total para cada uno sólo filas individuales. ¿Cómo logro el resultado que quiero?

+1

No entiendo la calcul detrás de la columna del total? – njzk2

+1

Con las funciones de Windows, puede obtener una consulta de línea única para devolver el conjunto de resultados que necesita. Desafortunadamente, MySQL no los admite. –

+1

@ njzk2: si observas la primera tabla, verás que el total coincide con los totales de todos los elementos con respecto a 'id'. El mod no parece tener ningún impacto real, por lo que 'total' parece ser una columna redundante para cada registro en la segunda tabla. –

Respuesta

7

Se podría hacer algo como esto:

SELECT `table`.`id`, `mod`, mySum 
FROM `table` 
JOIN (SELECT `id`, SUM(n1) + SUM(n2) + SUM(n3) AS mySum 
     FROM `table` GROUP BY `id`) as grpTable 
ON `table`.`id` = `grpTable`.`id` 

No estoy seguro sobre el rendimiento de esto, sin embargo ...

+0

Creo que requeriría el prefijo __'table' .__ antes de 'id' en la cláusula select – mickeymoon

+0

Tienes razón, actualizaré mi respuesta –

2

Probar:

select t.id, t1.mod, t.total 
from tab t1 
join (select id, sum(IFNULL(n1,0)+ IFNULL(n2,0)+ IFNULL(n3,0)) as total 
     from tab 
     group by id) t on t.id=t1.id 
1
SELECT `id`, `mod`, (SUM(n1) + SUM(n2) + SUM(n3)) AS total 
FROM `table` 
GROUP BY `id`,`mod` 
0

Esto debería funcionar para usted . Trabajó en Oracle. Compruebe si las palabras clave deben cambiarse en mysql.

SELECT x.id, x.mod, y.sum 
    FROM table x, 
     (SELECT id, sum(nvl(n1, 0) + nvl(n2, 0) + nvl(n3, 0)) sum 
      FROM table 
     GROUP BY id) y 
WHERE x.id = y.id; 
1

La segunda respuesta era correcta, todo lo que se necesitaba era llamadas correctas a ifnull

select t.id, t1.mod, t.total 
from test.source t1 
join (select id, sum(IFNULL(n1,0)+ IFNULL(n2,0)+ IFNULL(n3,0)) as total 
     from test.source 
     group by id) t on t.id=t1.id