我正在处理一个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
答案 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;