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 透视/反透视的主要内容,如果未能解决你的问题,请参考以下文章

SQL 中的透视/反透视

SQL 反透视该行并获取订单号

sql server 反透视表

如何在不使用数据透视和反透视的情况下在 SQL Server 中水平显示数据?

SQL - 一列的反透视结果

Access SQL 中的反透视