MySQL dynamic pivot table

后端 未结 2 728
闹比i
闹比i 2020-11-27 08:21

Im trying to get a pivot table with dynamic columns to work. When user_id is a string, it works fine but if its an int, then it seems to fail

Here is what I have so

相关标签:
2条回答
  • 2020-11-27 09:02

    Since the values are in int you are are making them the column names, you have to wrap the values in a backtick

    The sql will look like:

    max(case when user_id = 1 then score end) as `1`
    

    The full query will be:

    SET @sql = NULL;
    SELECT
      GROUP_CONCAT(DISTINCT
        CONCAT(
          'max(case when user_id = ''',
          user_id,
          ''' then score end) AS `',
          user_id, '`'
        )
      ) INTO @sql
    FROM  measure2;
    
    SET @sql = CONCAT('SELECT inspection_date, ', @sql, ' 
                      FROM measure2 
                      GROUP BY inspection_date');
    
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
    

    See SQL Fiddle with Demo

    0 讨论(0)
  • 2020-11-27 09:26

    Simple indeed - numbers alone aren't valid column names in SQL, so you need to amend your code to enclose them in backticks:

    SET @sql = NULL;
    SELECT
      GROUP_CONCAT(DISTINCT
        CONCAT(
          'max(case when user_id = ',
          user_id,
          ' then score end) AS `',
          user_id,
          '`'
        )
      ) INTO @sql
    FROM  measure2;
    
    SET @sql = CONCAT('SELECT inspection_date, ', @sql, ' 
                      FROM measure2 
                      GROUP BY inspection_date');
    
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
    

    I suggest retaining this change for string values as well, in case some of your string values match reserved words or include spaces.

    (Also, ' aren't required around numeric values, so I have removed them from the case clauses.)

    SQLFiddle here.

    0 讨论(0)
提交回复
热议问题