【问题标题】:MYSQL convert row to columnMYSQL 将行转换为列
【发布时间】:2018-03-13 02:54:52
【问题描述】:

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

这是原始表格:

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

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

我不知道算法出了什么问题。仅供参考,我在 SO 上遇到了一些类似的问题,但似乎都没有解决我的问题。这些是我提到的一些问题或信息:

  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

【问题讨论】:

    标签: php mysql sql phpmyadmin


    【解决方案1】:

    这仅比常规枢轴稍微复杂一些,因为您需要两列上的条件:

    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;
    

    【讨论】:

    • 我已经尝试过算法。但是,它调用了另一个错误:'致命错误:在 C:\xampp\phpMyAdmin\vendor\phpmyadmin\sql-parser\src\Utils\Query.php 中调用成员函数 getClauses() on null on line 567'跨度>
    • 顺便说一句,如果我从“@at”中删除双引号。同样的错误 #1054 - 'field list' 中的未知列 'QUIZ' 被调用
    • @MohammadThaqifTaher 。 . .哪个语句会导致该错误?
    • 这个:SET @condition = 'MAX(CASE WHEN assessment_type = ''@at'' AND assement_no = @an THEN assessment_marks END) as @at@an';
    • @MohammadThaqifTaher 。 . .将字符串分配给变量似乎是一个非常普通的操作。我不知道是什么导致了这样的错误。
    猜你喜欢
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 2013-10-01
    • 2021-06-20
    • 2014-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多