在没有pivot和group concat的mysql中进入列

时间:2013-09-16 16:45:10

标签: php mysql pivot

我有一张像

这样的表格
ID    Student    Exam
----------------------  
1      Kavi      BE       
2      MGR       BA      
3      MGR1      BE  

我正在用excel格式编写这些数据。问题是我需要考试领域像列一样,

BE      BA 
-------------
Kavi    NULL 
NULL    MGR
MGR1    NULL

这应该仅使用查询来完成,因为我无法修改excel类以使其打印列式数据。

我使用了group concat,但我需要将检查详细信息设置为单独的列而不是同一列。我不应该使用pivot,因为几个版本的mysql不支持它。 请帮助。

注意:此表可能包含多个记录,因此请提供可以动态运行的解决方案。

1 个答案:

答案 0 :(得分:1)

MySQL没有PIVOT函数,因此您需要使用带有CASE表达式的聚合函数来获得结果:

select
  max(case when exam = 'BE' then student end) BE,
  max(case when exam = 'BA' then student end) BA
from yourtable
group by id;

请参阅SQL Fiddle with Demo

如果您将拥有未知数量的exam值,那么您需要查看使用带有动态sql的预准备语句。代码类似于:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(case when exam = ''',
      exam,
      ''' then student end) AS `',
      exam, '`'
    )
  ) INTO @sql
from yourtable;

SET @sql 
    = CONCAT('SELECT ', @sql, ' 
              from yourtable
              group by id;');

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

SQL Fiddle with demo。两个版本都给出了结果:

|     BE |     BA |
|   Kavi | (null) |
| (null) |    MGR |
|   MGR1 | (null) |