1

我有一张像

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 不支持它。请帮忙。

注意:此表可能有多个记录,因此请提供可以动态工作的解决方案。

4

1 回答 1

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。两个版本都给出了结果:

|     BE |     BA |
|   Kavi | (null) |
| (null) |    MGR |
|   MGR1 | (null) |
于 2013-09-16T16:52:28.917 回答