SQL 透视/逆透视

时间:2021-04-16 09:38:05

标签: sql sql-server tsql pivot unpivot

我得到了以下结果,我尝试 unpivot 将所有列移动到行并将 Quarter 中的值作为列,但无论我尝试多少,我都没有得到结果我在找。

我希望有人能指出我正确的方向,因为枢轴/逆枢轴让我很困惑。

当前数据:

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   

2 个答案:

答案 0 :(得分: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 的原因。

答案 1 :(得分:0)

您可以尝试先对数据进行逆透视,然后再进行透视。

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

交叉应用将取消透视,聚合将为您透视数据。