在mysql中将行转换为列

时间:2018-03-12 04:48:06

标签: php mysql phpmyadmin

我正在努力 动态 转换行< - > mysql中的列。我在SO中看了几个问题,我能找到的最近的问题是:MySQL pivot row into dynamic number of columns

这是原始表:

+-----------+------------+----------+
|  name     |  type      |   marks  |
+-----------+------------+----------+
|  thaqif   |  Quiz 1    |   5.oo   |
+-----------+------------+----------+
|  ajis     |  Quiz 1    |   5.00   |
+-----------+------------+----------+
|  thaqif   |  Test      |   25.00  |
+-----------+------------+----------+
|  ajis     |  test      |   25.00  |
+-----------+------------+----------+

我想要的输出是这样的:

+-----------+------------+----------+
|  name     |  Quiz 1    |   Test   |
+-----------+------------+----------+
|  thaqif   |  5.00      |   25.oo  |
+-----------+------------+----------+
|  ajis     |  5.00      |   25.00  |
+-----------+------------+----------+

这是我修改过的代码:

SET @SQL = NULL;

SELECT
    GROUP_CONCAT(
        CONCAT('count(case when assessment_type = ''',assessment_type,''' then 1 end) AS ',replace(assessment_type, '', '')
        )
    ) INTO @sql
    from studentmarks;

SET @sql = CONCAT('SELECT student_name,', @sql, ' from studentmarks');

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

但是,输出只显示一行,标记甚至不正确。我相信 count() 函数会出现问题,但是删除该函数会显示无法调用 getClauses() 功能。

更新:我正在寻找动态sql的原因是,评估类型的数量是未知的。也许,会有一个演示文稿甚至用户插入的作业。因此,该表应该能够显示那些类型的评估及其标记

2 个答案:

答案 0 :(得分:0)

我给你简单的演示,你应该尝试这样

select s1.name, s1.marks as 'Quiz 1',s2.marks as 'Test' from studentmarks as s1 join studentmarks as s2 on s1.name = s2.name and s2.type = 'test' where s1.type = 'Quiz 1'

答案 1 :(得分:0)

您的陈述构建有很多问题1)计数不合适使用最大2)标记3)您不适应学生没有评估类型的情况 - 案例应该有else 0 4)替换不会删除评估类型中的空格5)group_concat应该包含一个distinct子句以避免重复6)在最终选择中没有group by