0

可能重复:
选择 MYSQL 行,但将行选择为列,将列选择为行

如何显示:

╔══════╦════╦════╗
║ Code ║ A  ║ B  ║
╠══════╬════╬════╣
║ xxxx ║ 50 ║ 63 ║
║ yyyy ║ 38 ║ 68 ║
║ .... ║ .. ║ .. ║
╚══════╩════╩════╝

喜欢这样:

╔══════╦══════╦══════╦═════╗
║ Code ║ xxxx ║ yyyy ║ ... ║
╠══════╬══════╬══════╬═════╣
║ A    ║   50 ║   63 ║ ... ║
║ B    ║   38 ║   68 ║ ... ║
╚══════╩══════╩══════╩═════╝

因为它可能有一些“代码”,如 xxxx、yyyy、zzzz ......
所以,我需要动态显示所有“代码”,而不需要硬编码。

4

1 回答 1

1

不幸的是,MySQL 没有一个UNPIVOTorPIVOT函数,但是可以使用UNION ALLforUNPIVOT和一个聚合函数来复制它们,并CASE使用PIVOT. 如果您知道要转换的值,则可以硬编码,然后类似于以下内容:

select col code,
  sum(case when code = 'xxxx' then value end) xxxx,
  sum(case when code = 'xxxx' then value end) yyyy
from
(
  select code, A value, 'A' col
  from table1
  union all
  select code, B value, 'B' col
  from table1
) x
group by col;

请参阅带有演示的 SQL Fiddle

但是您说您将拥有未知数量的code值。如果是这种情况,那么您可以pivot对数据使用准备好的语句:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'SUM(case when code = ''',
      code,
      ''' then value end) AS ',
      code
    )
  ) INTO @sql
FROM Table1;

SET @sql = CONCAT('SELECT col as code, ', @sql, ' 
                  FROM
                  (
                    select code, A value, ''A'' col
                    from table1
                    union all
                    select code, B value, ''B'' col
                    from table1
                  ) x
                  GROUP BY col');

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

请参阅SQL Fiddle with Demo

两者都产生相同的结果:

| CODE | XXXX | YYYY |
----------------------
|    A |   50 |   38 |
|    B |   63 |   68 |
于 2012-10-23T11:19:13.377 回答