用于转置的 Unpivot 枢轴

Posted

技术标签:

【中文标题】用于转置的 Unpivot 枢轴【英文标题】:Unpivot pivot for transpose 【发布时间】:2014-02-27 06:12:35 【问题描述】:

我有一个Accounts 表格,格式为[account name]Q1Q2 ....QN,其中包含每个帐户的收入详细信息。需要转置为[Quarter ][account1][account2]

我的查询如下。

Select [Quarters], [account 1], [ account2] 
from 
( 
  Select * 
  from Accounts
  unpivot 
  ( Value for [Quarters] in (Q1,Q2,Q3,Q4,.....) 
  ) unpiv
) as src
Pivot
(
   sum(value) for [Account name] in ([account1],[account2])
) piv 

但是这个查询返回的是 NULL。

帐户表

[Account name] [Q1] [Q2] [Q3]
   Apple        20   30   40
   Google       30   10   15
    IBM         34   23   12 

想要的输出

[Quarters] [Apple][Google][IBM]
   Q1       20     30      34
   Q2       30     10      23
   Q3       40     15      12

【问题讨论】:

【参考方案1】:

您可以同时使用 UNPIVOT 和 PIVOT 函数来返回结果。我不确定您为什么要返回空值,可能是您在子查询中包含了太多列。要获得结果,您应该能够使用:

select quarters, Apple, Google, IBM
from
(
  select accountname, quarters, value
  from accounts
  unpivot
  (
    value
    for quarters in (Q1, Q2, Q3)
  ) u
) d
pivot
(
  sum(value)
  for accountname in (Apple, Google, IBM)
) p;

见SQL Fiddle with Demo

【讨论】:

以上是关于用于转置的 Unpivot 枢轴的主要内容,如果未能解决你的问题,请参考以下文章

PIVOT/UNPIVOT 多于一列

复杂的枢轴/非枢轴操作

SqlServer行转列(PIVOT),列转行(UNPIVOT)总结

SQL Server中行列转换 Pivot UnPivot

改造一张桌子?使用枢轴/反枢轴

在 SQL Unpivot 中包含列名