mysql - 高效地将列转为行

标签 mysql unpivot

你能帮我完成这个项目吗?我确实研究了之前提出的问题,但它们似乎没有解决这种独特的情况。

示例数据:

 Member |    DOS    |  Dx1   |  Dx2  |  Dx3  | Dx4  | Dx5
 12345  | 1/1/2011  | 12142  | 12345 | 65657 | 5657 | 568
 56484  | 3/5/2011  | 568    | 56785 | 5695  | 575  | 168
 56872  | 2/12/2011 | 567    | 567   |

我需要看到的是:

 Member DOS DX Seq
 12345 1/1/2011 12142 Dx1
 12345 1/1/2011 12345 Dx2
 12345 1/1/2011 65657 Dx3

等等。仅显示那些不为空的 Dx,因此对于 56872,我们只会看到 Dx1 和 Dx2,但对于其他 2 个,我们会看到所有 5 个 Dx 的记录。

有人可以帮助我吗? 谢谢。

最佳答案

这种类型的数据转换称为UNPIVOT。不幸的是,MySQL 没有 unpivot 功能,但您可以通过几种不同的方式复制该功能。

您可以使用 UNION ALL 查询将每个列值转换为行:

select member, dos, dx, seq
from
(
  select member, dos, dx1 as dx, 'Dx1' as seq
  from yourtable
  union all
  select member, dos, dx2 as dx, 'Dx2' as seq
  from yourtable
  union all
  select member, dos, dx3 as dx, 'Dx3' as seq
  from yourtable
  union all
  select member, dos, dx4 as dx, 'Dx4' as seq
  from yourtable
  union all
  select member, dos, dx5 as dx, 'Dx5' as seq
  from yourtable
) d
where dx is not null
order by member, seq;

参见SQL Fiddle with Demo 。此方法将为您提供结果,但在较大的表上可能不是很有效。

另一种方法是在虚拟表上使用 CROSS JOIN:

select member, dos, dx, seq
from
(
  select t.member, t.dos, 
    case s.seq
      when 'Dx1' then dx1
      when 'Dx2' then dx2
      when 'Dx3' then dx3
      when 'Dx4' then dx4
      when 'Dx5' then dx5
    end DX,
    s.seq
  from yourtable t
  cross join
  (
    select 'Dx1' as seq union all
    select 'Dx2' as seq union all
    select 'Dx3' as seq union all
    select 'Dx4' as seq union all
    select 'Dx5' as seq
  ) s
) d
where dx is not null
order by member, seq;

参见SQL Fiddle with Demo 。两者都给出结果:

| MEMBER |                             DOS |    DX | SEQ |
|--------|---------------------------------|-------|-----|
|  12345 |  January, 01 2011 00:00:00+0000 | 12142 | Dx1 |
|  12345 |  January, 01 2011 00:00:00+0000 | 12345 | Dx2 |
|  12345 |  January, 01 2011 00:00:00+0000 | 65657 | Dx3 |
|  12345 |  January, 01 2011 00:00:00+0000 |  5657 | Dx4 |
|  12345 |  January, 01 2011 00:00:00+0000 |   568 | Dx5 |

关于mysql - 高效地将列转为行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20734820/

相关文章:

php - PDO 查询取决于完成的输入

sql - Oracle 中的数据透视表?

mysql - 在 Laravel 中查找超过 15 天的日期

php - MySQL LineString 与 Linestring 或 Polygon 的交集

php - 我如何将 "UserID"与 "username"链接起来,以便我可以更新我的表?

sql - 使用 PIVOT 将数据从宽翻转到高

scala - 如何在 Scala 中不硬编码列名称的情况下取消透视 Spark DataFrame?

mysql - MySQL IN 子句的特点

MySQL 将列转换为行

SQL: "Reverse"转置一个表