【问题标题】:unpivoting a sql table反透视 sql 表
【发布时间】:2012-11-09 23:20:08
【问题描述】:
A_first B_first C_first  A_second  B_second  C_second A_third  B_third  C_third
638      450     188       638       439       187      546      256      789

我有一张这样的表,只有一行。如何旋转这一行,以便将 A B C 作为列和每个 _first_second_third 的行?

我正试图围绕 sql 中的 pivot/unpivot 命令进行思考

A          B      C     
638      450     188     
638      439     187     
546      256     789

使用 SQL Server 2008,所以我有 pivot/unpivot 命令。更具体地说,SSMS 告诉我我连接的数据库是 9.0 SP3

【问题讨论】:

  • SQL 只是 结构化查询语言 - 许多数据库系统使用的语言,但不是数据库产品...很多事情都是特定于供应商的 - 所以我们真的需要知道您使用的是什么数据库系统(以及哪个版本)......
  • 我添加了该信息。谢谢
  • v9.0 = SQL Server 2005 - SQL Server 2008 将是“v10”。
  • 哦,我明白了。当我在 SSMS 中单击 about 时,它显示 Microsft SQL Server 2008 R2。也许这只是我本地机器上安装的软件?\
  • 这很可能是 SSMS 客户端工具的版本 - 但不必与引擎相同。但是对于如何使用某些功能这样的问题,引擎版本当然更相关

标签: sql tsql sql-server-2005 pivot unpivot


【解决方案1】:

您没有指定您使用的 RDBMS,所以这里有两个解决方案。如果你有一个UNPIVOT 函数,然后是一个PIVOT

select *
from
(
  select value, left(fields, 1) col,
    substring(fields, 3, len(fields) -2) row
  from yourtable
  unpivot
  (
    value
    for fields in(A_first, B_first, C_first,
                  A_second, B_second, C_second,
                  A_third, B_third, C_third)
  ) unpiv
) src
pivot
(
  max(value)
  for col in ([A], [B], [C])
) piv

SQL Fiddle with Demo

如果你没有UNPIVOTPIVOT函数,那么你可以使用UNION ALL

select
  max(case when col = 'A' then value end) A,
  max(case when col = 'B' then value end) B,
  max(case when col = 'C' then value end) C
from
(
  select value, left(fields, 1) col, substring(fields, 3, len(fields) -2) row
  from
  (
    select A_first value, 'A_first' fields
    from yourtable
    union all
    select B_first value, 'B_first' fields
    from yourtable
    union all
    select C_first value, 'C_first' fields
    from yourtable
    union all
    select A_second value, 'A_second' fields
    from yourtable
    union all
    select B_second value, 'B_second' fields
    from yourtable
    union all
    select C_second value, 'C_second' fields
    from yourtable
    union all
    select A_third value, 'A_third' fields
    from yourtable
    union all
    select B_third value, 'B_third' fields
    from yourtable
    union all
    select C_third value, 'C_third' fields
    from yourtable
  ) unpiv
) src
group by row

SQL Fiddle with Demo

两者都会产生相同的结果:

|   A |   B |   C |
-------------------
| 638 | 450 | 188 |
| 638 | 439 | 187 |
| 546 | 256 | 789 |

注意,为了执行此任务,每列的数据类型必须相同。如果不是,那么您需要在UNPIVOT 之前先convert 数据。

这个答案做了一些假设:

  1. 现有列将始终以新列值开头 (A, BC 等)
  2. 现有列将始终以两个字符开头 在行号之前。

【讨论】:

  • ... 除了,他想要列 ABC,而不是每个列。他想要_first_second_third 的行
  • 谢谢,这很有帮助。然而,这不是所需的输出。我现在正在用我的预期输出更新我的帖子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多