假设我有一张表,其中包含每次评估(例如:测验、测试等)的学生分数。
这是原始表格:
我想将评估类型转换为列。这是我想要的输出:
+---------------+------------+----------+
| student_name | Quiz 1 | QUIZ 2 |
+---------------+------------+----------+
| thaqif | 4.00 | 5.oo |
+---------------+------------+----------+
| ajis | 4.00 | 5.00 |
+---------------+------------+----------+
我能够用这个算法产生这个:
SELECT student_name,
MAX(IF((`assessment_type` = 'QUIZ' AND `assessmet_no` = '1'), assessment_marks, NULL)) 'QUIZ 1',
MAX(IF((`assessment_type` = 'QUIZ' AND `assessmet_no` = '2'), assessment_marks, NULL)) 'QUIZ 2'
FROM studentmarks
GROUP BY student_name
然而,在实际情况中,评估类型的数量是未知的。上面的算法仅在我们有固定数量的assessment_type时才有用。
为了解决这个问题,我找到了一种我相信可以解决问题的算法:
SET @sql = NULL;
SELECT
GROUP_CONCAT(
CONCAT(
'MAX(IF(`assessment_type` = ', `assessment_type`, ',assessment_marks, NULL)) AS ', `assessment_type`)
) INTO @sql
FROM studentmarks;
SET @sql = CONCAT('SELECT student_name, ', @sql, '
FROM studentmarks
GROUP BY student_name');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
不幸的是,这个算法调用了这个错误:
#1054 - Unknown column 'QUIZ' in 'field list'
我不知道该算法有什么问题。仅供引用,我已经解决了一些类似的问题,但似乎没有一个能解决我的问题。这些是我提到的一些问题或信息:
最佳答案
这仅比常规数据透视稍微复杂一点,因为您需要两列上的条件:
select student_name,
max(case when assessment_type = 'QUIZ' and assesment_no = 1 then marks end) as quiz1,
max(case when assessment_type = 'QUIZ' and assesment_no = 2 then marks end) as quiz2
from student_marks
group by student_name;
您可以将其扩展为动态 SQL:
SET @condition = 'MAX(CASE WHEN assessment_type = ''@at'' AND assement_no = @an THEN assessment_marks END) as @at@an';
SELECT @conditions := GROUP_CONCAT(REPLACE(REPLACE(@condition, '@at', assessment_type), '@an', assessment_no))
FROM studentmarks;
SET @sql = CONCAT('
SELECT student_name, ', @conditions, '
FROM studentmarks
GROUP BY student_name');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
关于php - MYSQL 将行转换为列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49247578/