将行反透视成列

Posted

技术标签:

【中文标题】将行反透视成列【英文标题】:Unpivot rows into columns 【发布时间】:2019-10-31 10:14:50 【问题描述】:

我想根据案例编号取消透视表:(格式表见图片)

但是,它是一个大型数据集,因此我无法将每个日期的值都放在 unpivot 函数中。任何帮助将不胜感激!

【问题讨论】:

mysql 没有 unpivot 函数 - 你想要一个 mysql 答案、一个 sqlserver 答案还是两者兼而有之? 数据图像对我们没有帮助。如果要提供数据,请将其提供为格式化的 text 或 DDL 和 DML 语句。同时,修复你的标签,SQL Server 和 MySQL 是完全不同的 RDBMS(我已经删除了冲突的标签)。你说你也“尝试过”;如果你有,请向我们展示这些尝试。 【参考方案1】:

我建议为此使用cross apply

select c.case_number, v.[date], v.status
from cases c cross apply
     (values (open, 'open'), (approved, 'approved')
     ) v([date], status)
order by c.case_number, v.[date];

从技术上讲,apply 实现了“横向连接”。这是一个非常强大的机制,反透视是对它们所做工作的一个很好的介绍。

相比之下,unpivot 是仅在少数数据库中可用的定制语法。它只做一件事——而这件事可以用另一种方式轻松完成。

【讨论】:

【参考方案2】:

SQL Fiddle

MS SQL Server 2017 架构设置

create table Cases (CaseNumber int, OpenD date , Approved date )
insert into Cases(CaseNumber,OpenD,Approved)values(3527,'2/11/18','5/11/18')
insert into Cases(CaseNumber,OpenD,Approved)values(7756,'3/12/18','10/12/18')
insert into Cases(CaseNumber,OpenD,Approved)values(6192,'1/1/19',NULL)

查询 1

Select CaseNumber,Date,Status
FROM Cases c
unpivot (
  Date for Status in (OpenD,Approved)
  ) as UnPVt

Results

| CaseNumber |       Date |   Status |
|------------|------------|----------|
|       3527 | 2018-02-11 |    OpenD |
|       3527 | 2018-05-11 | Approved |
|       7756 | 2018-03-12 |    OpenD |
|       7756 | 2018-10-12 | Approved |
|       6192 | 2019-01-01 |    OpenD |

【讨论】:

以上是关于将行反透视成列的主要内容,如果未能解决你的问题,请参考以下文章

将行透视到列级别

在 Tableau 中反透视数据 将行转换为列

将行转置为 BigQuery 中的列(数据透视实现)[重复]

这是一个员工数据,我想使用数据透视将行数据转换为列

如何将行数据透视到特定列 db2

如何在不使用数据透视的情况下将行转换或转置为 SQL 中的列?