2012-10-12 14 views
6

quindi ho una tabella come questa:Somma più righe

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

e voglio riassumere ogni valore per tutte le righe per un ID specifico in un totale di colonna chiamata, ma io non voglio raggruppa l'id insieme perché hanno un numero di mod diverso. Voglio un risultato come questo:

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

non posso usare GROUP BY perché mi darà il totale per ogni singolo solo righe. Come ottengo il risultato che voglio?

+1

Non capisco calcolo de dietro la colonna totale? – njzk2

+1

Con le funzioni di Windows è possibile ottenere una query a riga singola per restituire il set di risultati necessario. Sfortunatamente, MySQL non li supporta. –

+1

@ njzk2: Se guardi la prima tabella, vedrai le partite totali con i totali per tutti gli elementi contro 'id'. Il mod non sembra avere alcun impatto reale quindi "total" sembra essere una colonna ridondante per ogni record nella seconda tabella. –

risposta

7

Si potrebbe fare qualcosa di simile:

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` 

Non sono sicuro circa le prestazioni di questo, però ...

+0

Penso che richiederebbe il prefisso __'table' .__ prima di 'id' nella clausola select – mickeymoon

+0

Hai ragione, aggiornerò la mia risposta –

2

Prova:

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

Questo dovrebbe funzionare per voi . Ha funzionato in Oracle. Controlla se le parole chiave devono essere cambiate in 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 seconda risposta era corretta, tutto quello che serviva era chiamate corrette per 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