php - MYSQL 将行转换为列

标签 php mysql sql phpmyadmin

假设我有一张表,其中包含每次评估(例如:测验、测试等)的学生分数。

这是原始表格:

studentmarks

我想将评估类型转换为列。这是我想要的输出:

+---------------+------------+----------+
|  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'

我不知道该算法有什么问题。仅供引用,我已经解决了一些类似的问题,但似乎没有一个能解决我的问题。这些是我提到的一些问题或信息:

  1. MySQL pivot row into dynamic number of columns

  2. Mysql query to dynamically convert rows to columns on the basis of two columns

  3. Mysql query to dynamically convert rows to columns

  4. http://buysql.com/mysql/14-how-to-automate-pivot-tables.html

最佳答案

这仅比常规数据透视稍微复杂一点,因为您需要两列上的条件:

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/

相关文章:

mysql - 使用 count(*) 和 inner join 时查询速度慢

sql - 访问 Azure 自动备份

php - mySQL 搜索标签内的正则表达式

php - 一个特定文件夹中新文件的默认 chmod

php - composer.json 中的 dev-master,这是疯了吗?

mysql - SQL - 每月的最后一天

c# - 如何使用包含在 Linq to SQL 中搜索字符串

php - 如何使用php保护列后导出Excel文件

php - Mysql 搜索类似 2 个单词的顺序

Java+SQL执行查询并返回结果