SQL 透视/反透视
Posted
技术标签:
【中文标题】SQL 透视/反透视【英文标题】:SQL Pivot / Unpivot 【发布时间】:2021-04-16 09:38:05 【问题描述】:我有以下结果,我尝试 unpivot 将所有列移动到行并将 Quarter 中的值作为列,但无论我尝试多少,我都没有得到结果我正在寻找。
我希望有人能指出我正确的方向,因为 pivot/unpivot 让我很困惑。
当前数据:
Qarter Fatal incidents PSC Detentions Oil spill to Sea
Q1 2021 0 0 1
Q2 2021 1 1 1
Q3 2021 0 0 0
想要的结果是
Q1 2021 Q2 2021 Q3 2021
Fatal incidents 0 1 0
PSC Detentions 0 1 0
Oil spill to sea 1 1 0
【问题讨论】:
你想要的输出是什么? 致命事故、PSC 滞留、PSC 检查、漏油、险情、SIRE、CDI、LTI、RWC、MTC 和工时作为行 2021 年第一季度、2021 年第二季度、2021 年第三季度和 2021 年第四季度作为列 根据问题指南,请不要发布代码、数据、错误消息等的图像 - 复制或键入问题中的文本。请保留将图像用于图表或演示渲染错误,无法通过文本准确描述的事情。 很抱歉 Dale 发布了一张图片,我不太熟悉如何在这里以良好的方式呈现数据,这就是它这样做的原因 我已经更新了表格数据 【参考方案1】:这回答了问题的原始版本。
你似乎想要所有的列,除了第二个,它变成了两个:
select t.quarter, t.psc_detentions, t.oil_spill_sea, . . .,
v.marks, v.q
from t cross apply
(values ('Fatal incidents', Fatal_incidents)
) v(q, marks);
请注意,对于这个简单的示例,您甚至不需要apply
:
select t.quarter, t.psc_detentions, t.oil_spill_sea, . . .,
Fatal_incidents as marks, 'Fatal incidents' as q
from t;
不过,我猜测您有多个列要以这种方式处理,这就是我建议 apply
的原因。
【讨论】:
这仍将所有列显示为列。我希望所有的列都变成行,行变成列 @Pochen。 . .您的问题中有两个表格图像(我应该补充一点,不鼓励出于此类目的使用图像;使用文本表格或 DDL)。据推测,第一个是源数据,第二个是期望的结果。如果不是,您的问题不清楚,我可以投票结束。 我以结构化的方式使用数据更新了帖子。很抱歉造成混乱【参考方案2】:您可以尝试先取消透视数据,然后再进行透视。
select ca.Type
, max(case when t.Qarter = 'Q1 2021' then ca.Value end) as [Q1 2021]
, max(case when t.Qarter = 'Q2 2021' then ca.Value end) as [Q2 2021]
, max(case when t.Qarter = 'Q3 2021' then ca.Value end) as [Q3 2021]
from dbo.Table1 as t
cross apply ( values ('Fatal incidents', [Fatal incidents])
, ('PSC Detentions', [PSC Detentions])
, ('Oil spill to Sea', [Oil spill to Sea])) as ca ([Type], [Value])
group by ca.Type
交叉应用将取消透视,聚合将为您透视数据。
【讨论】:
以上是关于SQL 透视/反透视的主要内容,如果未能解决你的问题,请参考以下文章