将行反透视成列
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 |
【讨论】:
以上是关于将行反透视成列的主要内容,如果未能解决你的问题,请参考以下文章