我正在努力 动态 转换行< - > 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的原因是,评估类型的数量是未知的。也许,会有一个演示文稿甚至用户插入的作业。因此,该表应该能够显示那些类型的评估及其标记
答案 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