将多行转换为表中的列

时间:2013-01-22 09:05:16

标签: mysql sql

我有一个包含以下行的表:

╔══════════╦═══════════╦════════╗
║ PK_VALUE ║ RATING_ID ║ RATING ║
╠══════════╬═══════════╬════════╣
║       11 ║         1 ║     90 ║
║       11 ║         2 ║     80 ║
║       11 ║         3 ║     90 ║
║       12 ║         1 ║     90 ║
║       12 ║         2 ║     80 ║
║       12 ║         3 ║     90 ║
╚══════════╩═══════════╩════════╝

我希望上表为:

╔══════════╦════════════╦════════════╦════════════╗
║ PK_VALUE ║ RATING_ID1 ║ RATING_ID2 ║ RATING_ID3 ║
╠══════════╬════════════╬════════════╬════════════╣
║       11 ║         90 ║         80 ║         90 ║
║       12 ║         90 ║         80 ║         90 ║
╚══════════╩════════════╩════════════╩════════════╝

我尝试了一些我在Google搜索中找到的建议,但它显示我们必须插入表格。我不确定这一点。欢迎任何建议......

I have uploaded the screenshots related to my doubt.. image of the result query before what i use to get..

In this image we can see two review ID's for the same pk_value.. But I am receiving only one review ID after including your query.. result after including your query..

在上面的How can I get result of both the review ID's???

1 个答案:

答案 0 :(得分:3)

使用CASEMAX

SELECT  pk_value,
        MAX(CASE WHEN rating_ID = 1 THEN rating ELSE NULL END) AS r1,
        MAX(CASE WHEN rating_ID = 2 THEN rating ELSE NULL END) AS r2,
        MAX(CASE WHEN rating_ID = 3 THEN rating ELSE NULL END) AS r3
FROM    tableName
GROUP   BY pk_value

否则,如果您的Rating_ID数量未知且您不想不断更新查询,建议使用Dynamic SQL

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'MAX(CASE WHEN rating_ID = ',
      rating_id,
      ' then rating ELSE NULL end) AS `rating_id', rating_id, '`')
  ) INTO @sql
FROM TableName;

SET @sql = CONCAT('SELECT  pk_value, ', @sql, ' 
                   FROM    tableName
                   GROUP   BY pk_value');

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

上面的查询都有相同的结果,

╔══════════╦════════════╦════════════╦════════════╗
║ PK_VALUE ║ RATING_ID1 ║ RATING_ID2 ║ RATING_ID3 ║
╠══════════╬════════════╬════════════╬════════════╣
║       11 ║         90 ║         80 ║         90 ║
║       12 ║         90 ║         80 ║         90 ║
╚══════════╩════════════╩════════════╩════════════╝