2012-10-12 25 views
6

Vì vậy, tôi có một bảng như thế này:Sum nhiều hàng

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

Và tôi muốn tổng hợp mỗi giá trị cho tất cả các hàng cho một id cụ thể vào một tổng cuộc gọi cột, nhưng tôi không muốn nhóm id lại với nhau vì chúng có số mod khác nhau. Tôi muốn có kết quả như sau:

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

Tôi không thể sử dụng nhóm bởi vì nó sẽ cho tôi tổng số chỉ cho mỗi hàng riêng lẻ. Làm thế nào để đạt được kết quả mà tôi muốn?

+1

Tôi không hiểu được calcul đằng sau tổng cột? – njzk2

+1

Với các hàm Windows, bạn có thể nhận được một truy vấn một dòng để trả về kết quả mà bạn cần. Thật không may, MySQL không hỗ trợ chúng. –

+1

@ njzk2: Nếu bạn nhìn vào bảng đầu tiên, bạn sẽ thấy tổng số trận đấu với tổng số cho tất cả các mục chống lại 'id'. Các mod dường như không có bất kỳ tác động thực sự để 'tổng' xuất hiện là một cột dư thừa cho mỗi bản ghi trong bảng thứ hai. –

Trả lời

7

Bạn có thể làm một cái gì đó như thế này:

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` 

Không chắc về hiệu suất của điều này mặc dù ...

+0

Tôi nghĩ rằng nó sẽ yêu cầu __'table' .__ tiền tố trước 'id' trong mệnh đề chọn – mickeymoon

+0

Bạn nói đúng, tôi sẽ cập nhật câu trả lời của mình –

2

Hãy thử:

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

này nên làm việc cho bạn . Làm việc tại Oracle. Kiểm tra xem các từ khóa có cần phải được thay đổi trong mysql hay không.

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

Câu trả lời thứ hai là đúng, tất cả những gì cần thiết là các cuộc gọi đúng 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