T-SQL Pivot / Unpivot(转置)列标题需要数据行

时间:2013-08-01 17:15:00

标签: sql sql-server-2008 tsql pivot unpivot

我正在处理一个T-SQL问题,我需要将行转换为列,并在Simple way to transpose columns and rows in Sql?

的每个帖子中使用UNPIVOT和PIVOT

没问题。它完全符合我对行/列操作的要求。但是,我真正想做的是让用于列标题的值成为结果中的另一行。

我的缩写代码是:

SELECT * 
FROM   (SELECT fiscalyear, 
              Sum(totalrecords)  AS TotalRecords 
        FROM   dbo.tbleirstatisticsoverviewsummary 
        WHERE  fiscalquarter = 'ALL' 
               AND branchcode = 'ALL' 
        GROUP  BY fiscalyear, 
                  fiscalquarter, 
                  branchcode) AS p 
       UNPIVOT (value 
               FOR colname IN ( totalrecords )) AS unpvt 
       PIVOT   (Max(value) For  FiscalYear IN ([2012],[2013],[ALL])) as  p  

它呈现的是:
colname 2012 2013 ALL
总记录421 227 648

第一行是列标题。

关于如何让列标题成为数据行的任何想法?

添加一些示例原始数据 fiscalyear TotalRecords 2012 421 2013 227 全部648

1 个答案:

答案 0 :(得分:1)

你正在做一些令人困惑的事情。

首先,通常您将忽略多列。现在,你正在忽略一个列,看起来你只是为了重命名这个列?

其次,您要聚合数据两次,PIVOT应该能够使用SUM()来处理聚合。

第三,对于为什么需要将列标题作为一行进行操作并不清楚,您希望调用列标题的内容是什么?

根据您的样本数据,您应该只能应用PIVOT功能:

select 'TotalRecords' TotalRecords, 
  [2012],
  [2013],
  [All]
from tbleirstatisticsoverviewsummary
pivot
(
  sum(totalrecords)
  for FiscalYear IN ([2012],[2013],[ALL])
) p;

SQL Fiddle with Demo。然后,如果您想要一个包含列标题的行,那么您可以使用UNION ALL:

select 'colname' col1, 
  2012 col2, 
  2013 col3, 
  'All' col4
union all
select 'TotalRecords' TotalRecords, 
  [2012],
  [2013],
  [All] = cast([all] as varchar(10))
from tbleirstatisticsoverviewsummary
pivot
(
  sum(totalrecords)
  for FiscalYear IN ([2012],[2013],[ALL])
) p;

请参阅SQL Fiddle with Demo