【问题标题】:How to dynamically turn rows into columns and vice versa [duplicate]如何动态地将行变成列,反之亦然[重复]
【发布时间】:2012-10-23 07:10:19
【问题描述】:

可能重复:
Select MYSQL rows but rows into columns and column into rows

如何显示:

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

喜欢这个:

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

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

【问题讨论】:

标签: mysql sql pivot dynamic-data


【解决方案1】:

不幸的是,MySQL 没有UNPIVOTPIVOT 函数,但可以使用UNION ALL 来复制它们,UNPIVOT 和带有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 with Demo

但是您说您将拥有未知数量的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 |

【讨论】:

  • 如果这个问题出现在“toad for oracle”(plsql) 中怎么样。它的解决方案是什么?非常感谢任何人的帮助。
  • @Jimmy428 什么版本的Oracle?答案因版本而异。
猜你喜欢
  • 1970-01-01
  • 2021-09-28
  • 1970-01-01
  • 2012-06-28
  • 1970-01-01
  • 1970-01-01
  • 2012-12-06
  • 1970-01-01
  • 2023-03-17
相关资源
最近更新 更多