-2

我正在处理一个 T-SQL 问题,我需要将行转换为列,并根据在 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
TotalRecords 421 227 648

第一行是列标题。

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

添加一些示例原始数据会计年度 TotalRecords 2012 421 2013 227 ALL 648

4

1 回答 1

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

于 2013-08-01T17:45:55.753 回答