我需要在MS SQL中进行以下转置
从:
Day A B --------- Mon 1 2 Tue 3 4 Wed 5 6 Thu 7 8 Fri 9 0
要以下内容:
Value Mon Tue Wed Thu Fri -------------------------- A 1 3 5 7 9 B 2 4 6 8 0
我了解PIVOT只有一列(A)时该如何处理,但无法弄清有多列要转置(A,B,…)时该如何做。
PIVOT
要转置的示例代码:
select LEFT(datename(dw,datetime),3) as DateWeek, sum(ACalls) as A, Sum(BCalls) as B from DataTable group by LEFT(datename(dw,datetime),3)
表结构:
Column DataType DateTime Datetime ACalls int BCalls int
任何帮助都感激不尽。
为了将数据转置为所需的结果,您将需要同时使用UNPIVOT和PIVOT函数。
UNPIVOT
该UNPIVOT函数采用A和B列,并将结果转换为行。然后,您将使用该PIVOT函数将day值转换为列:
A
B
day
select * from ( select day, col, value from yourtable unpivot ( value for col in (A, B) ) unpiv ) src pivot ( max(value) for day in (Mon, Tue, Wed, Thu, Fri) ) piv
请参阅带有演示的SQL Fiddle。
如果使用的是SQL Server 2008+,则可以使用CROSS APPLYwithVALUES取消透视数据。您的代码将更改为以下内容:
CROSS APPLY
VALUES
select * from ( select day, col, value from yourtable cross apply ( values ('A', A),('B', B) ) c (col, value) ) src pivot ( max(value) for day in (Mon, Tue, Wed, Thu, Fri) ) piv
编辑#1,将当前查询应用到上述解决方案中,您将使用类似于以下内容的内容:
select * from ( select LEFT(datename(dw,datetime),3) as DateWeek, col, value from DataTable cross apply ( values ('A', ACalls), ('B', BCalls) ) c (col, value) ) src pivot ( sum(value) for dateweek in (Mon, Tue, Wed, Thu, Fri) ) piv