我有一张像
这样的表格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不支持它。 请帮助。
注意:此表可能包含多个记录,因此请提供可以动态运行的解决方案。
答案 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;
如果您将拥有未知数量的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) |