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

我混淆了获得结果的方式..我尝试使用加入、联合但仍然没有得到解决方案。请给我建议来解决它。谢谢

4

2 回答 2

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 ║
╚════════╩═══════════╩═══════════╩═══════════╝

否则,如果您的度数未知,则更优选的解决方案是创建动态查询。

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;
于 2013-06-13T03:52:10.607 回答
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;
于 2013-06-13T03:54:41.880 回答