2012-10-12 14 views
6

Więc mam tabeli jak poniżej:Sum wiele wierszy

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

I chcę podsumować każdą wartość dla wszystkich wierszy dla danego id w sumie połączeń kolumny, ale nie chcą pogrupuj id razem, ponieważ mają inny numer mod. Chcę uzyskać wynik podobny do tego:

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

Nie mogę użyć grupy przez, ponieważ da mi sumę dla poszczególnych rzędów. Jak osiągnąć pożądany rezultat?

+1

ja nie rozumiem CALCUL za łączną kolumnie? – njzk2

+1

Dzięki funkcjom Windows można uzyskać zapytanie o pojedynczą linię, aby zwrócić wybrany zestaw wyników. Niestety, MySQL ich nie obsługuje. –

+1

@ njzk2: Jeśli spojrzysz na pierwszą tabelę, zobaczysz, że łączna liczba wyników z sumami dla wszystkich pozycji jest równa "id". Mod nie wydaje się mieć rzeczywistego wpływu, więc 'total' wydaje się być redundantną kolumną dla każdego rekordu w drugiej tabeli. –

Odpowiedz

7

Można zrobić coś takiego:

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` 

nie wiesz o wykonywaniu tego mimo ...

+0

Myślę, że to wymagałoby prefiksu __'table' .__ przed 'id' w klauzuli select – mickeymoon

+0

Masz rację, zaktualizuję moją odpowiedź –

2

Spróbuj:

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

ten powinien pracować dla Ciebie . Pracował w Oracle. Sprawdź, czy słowa kluczowe powinny zostać zmienione w 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

Druga odpowiedź była prawidłowa, to wszystko było potrzebne poprawne połączenia do 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