2012-10-12 32 views
6

所以我有這樣的一個表:總和多行

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

而且我想總結一下每個值的所有行特定ID成列的呼叫總,但我不希望將id分組在一起,因爲他們有不同的mod號碼。我想要這樣的結果:

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

我不能使用group by,因爲它會給我每個單獨行的總數。我如何獲得我想要的結果?

+1

我不明白,總列後面的演算? – njzk2

+1

使用Windows函數,您可以獲得單行查詢來返回您需要的結果集。不幸的是,MySQL不支持它們。 –

+1

@ njzk2:如果您查看第一個表格,您會看到總計與所有項目的總數與「id」匹配。 mod似乎沒有任何實際影響,因此'total'對於第二個表中的每個記錄來說似乎是一個冗餘列。 –

回答

7

你可以做這樣的事情:

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` 

不知道關於這個性能雖然...

+0

我認爲在select子句中'id'之前需要__'table' .__前綴 – mickeymoon

+0

你說得對,我會更新我的答案 –

2

嘗試:

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

這應該爲你工作。在Oracle工作。檢查是否需要在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

第二個答案是正確的,所有需要的只是正確調用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