在MySQL中生成动态数据透视表

时间:2019-03-31 07:15:31

标签: mysql

我有一个名为mdl_grade_grades的表,其中包含列id,userid,itemid,rawgrademax,finalgrade 我还有另一个表ID为itemname的表mdl_grade_items,其中mdl_grade_grades中的itemid = mdl_grade_items中的id

我正在使用MySQL数据库,在不同情况下项目数会有所不同。

最近3天,我进行了很多研究,但我的MySQL技能并未丰富到理解和修改可用的相关解决方案。我仍然尝试修改以下线程中提供的查询: MySQL dynamic pivot table MySQL Table pivot - Dynamic

但是,我在“ PREPARE stmt FROM @sql;”附近收到错误消息

我尝试过:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(case when itemid = ''',
      itemid,
      ''' then finalgrade end) AS `',
      itemid, '`'
    )
  ) INTO @sql
FROM  mdl_grade_grades;

SET @sql = CONCAT('SELECT userid, ', @sql, ' 
                  FROM mdl_grade_grades 
                  GROUP BY userid');

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

我想要如下所示的输出 Desired Output

因此,无论用户有记录何处,项目名称都将成为标题,并且其值将等于(finalgrade / rawgrademax)* 100。如果用户没有该项目的记录,则该项目的值将保持空白。

1 个答案:

答案 0 :(得分:0)

您的错误可以从代码中删除,您可以明智地理解

SET @sql = NULL;
    SELECT GROUP_CONCAT(DISTINCT CONCAT( ' MAX(CASE ',
                                itemid,
                                ' WHEN ''',
                                '' ,
                                ''' THEN ',
                                finalgrade,
                                '  END) ''',
                                itemid,
                                '''') )
        INTO @sql
        FROM mdl_grade_grades;



SET @sql = CONCAT('SELECT userid, ', @sql, ' 
                  FROM mdl_grade_grades 
                  GROUP BY userid');

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