SQL Pivot/Unpivot
我得到了下面的结果,我尝试取消Pivot以将所有列移动到行中,并将来自Quarter的值作为列,但无论我如何尝试,我都没有得到我想要的结果 我希望有人能给我指出正确的方向,因为支点/unpivot让我很困惑 当前数据:SQL Pivot/Unpivot,sql,sql-server,tsql,pivot,unpivot,Sql,Sql Server,Tsql,Pivot,Unpivot,我得到了下面的结果,我尝试取消Pivot以将所有列移动到行中,并将来自Quarter的值作为列,但无论我如何尝试,我都没有得到我想要的结果 我希望有人能给我指出正确的方向,因为支点/unpivot让我很困惑 当前数据: Qarter Fatal incidents PSC Detentions Oil spill to Sea Q1 2021 0 0 1 Q2 2021 1
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
这回答了问题的原始版本 您似乎想要所有列,但第二列除外,它变成了两列:
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
您可以尝试先取消数据的Pivot,然后再透视
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
交叉应用将取消Pivot,聚合将为您旋转数据。您希望的输出是什么?致命事件、PSC滞留、PSC检查、漏油、未遂事件、父系、CDI、LTI、RWC、MTC和工时列为Q1 2021、Q2 2021、Q3 2021和Q4 2021列。根据问题指南,请不要发布代码、数据和工时的图像,错误消息等-将文本复制或键入问题。请保留图像用于图表或演示渲染错误,这是无法通过文本准确描述的。很抱歉Dale发布了图像,我不太熟悉如何在此处以良好的方式显示数据,这就是为什么itI使用表格数据进行了更新。这仍然将所有列显示为列。我希望所有列都变成行,而行变成行columns@Pochen . . . 您的问题中有两个表格图像(我应该补充一点,不鼓励出于此类目的使用图像;请使用文本表格或DDL)。据推测,第一个是源数据,第二个是期望的结果。如果没有,你的问题不清楚,我可以投票决定结束。我已经用结构化的方式用数据更新了这篇文章。抱歉搞混了