2013-06-13 45 views
0

我遇到问题以选择排序数据。 这个我解释我的问题:来自一个表的不同值计数的总和

表学生:

id name degree 
1 Adam 11 
2 Adam 12 
3 Beny 11 
4 Beny 13 
5 Charly 12 
6 Adam 11 

我想要得到的结果是这样的:

name degree 11 degree 12 degree 13 
Adam 2   1   0 
Beny 1   0   1 
Charly 0   1   0 

我困惑得到它产生的方式..我尝试使用加入,工会,仍然没有得到解决方案。请给我建议解决它。由于

回答

6

如果你已经知道的degree数量,这可以使用静态查询来完成,

SELECT Name, 
     SUM(CASE WHEN degree = 11 THEN 1 ELSE 0 END) `degree 11`, 
     SUM(CASE WHEN degree = 12 THEN 1 ELSE 0 END) `degree 12`, 
     SUM(CASE WHEN degree = 13 THEN 1 ELSE 0 END) `degree 13` 
FROM tableName 
GROUP BY Name 

输出

╔════════╦═══════════╦═══════════╦═══════════╗ 
║ NAME ║ DEGREE 11 ║ DEGREE 12 ║ DEGREE 13 ║ 
╠════════╬═══════════╬═══════════╬═══════════╣ 
║ Adam ║   2 ║   1 ║   0 ║ 
║ Beny ║   1 ║   0 ║   1 ║ 
║ Charly ║   0 ║   1 ║   0 ║ 
╚════════╩═══════════╩═══════════╩═══════════╝ 

否则,如果您有未知数量的程度,更优选的溶胶ution是创建一个动态查询。

SELECT GROUP_CONCAT(DISTINCT 
     CONCAT('SUM(CASE WHEN degree = ', 
       degree, 
       ' THEN 1 ELSE 0 END) AS ', 
       CONCAT('`degree ', degree, '`') 
       )) INTO @sql 
FROM Tablename; 

SET @sql = CONCAT('SELECT Name, ', @sql, ' 
        FROM tableName 
        GROUP BY Name'); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 
+0

真棒。这是工作..谢谢JW。 – indi60

+0

@ indi60请标记为答案 – vikas

0
select name, 
     sum(if(degree=11,1,0)) "degree 11", 
     sum(if(degree=12,1,0)) "degree 12", 
     sum(if(degree=13,1,0)) "degree 13" 
from student 
group by name;