SQL转置全表

SQL转置全表

我需要在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,...)


要转置的示例代码:


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

任何帮助都感激不尽。


达令说
浏览 1010回答 1
1回答

慕哥9229398

为了将数据转换为您想要的结果,您需要同时使用UNPIVOT和PIVOT函数。该UNPIVOT函数接受A和B列并将结果转换为行。然后,您将使用该PIVOT函数将day值转换为列:select *from(   select day, col, value  from yourtable  unpivot   (     value    for col in (A, B)   ) unpiv) srcpivot(   max(value)   for day in (Mon, Tue, Wed, Thu, Fri)) piv请参阅SQL Fiddle with Demo。如果您使用的是SQL Server 2008+,则可以使用CROSS APPLYwith VALUES来取消数据的移动。您的代码将更改为以下内容:select *from(   select day, col, value  from yourtable  cross apply   (     values ('A', A),('B', B)   ) c (col, value)) srcpivot(   max(value)   for day in (Mon, Tue, Wed, Thu, Fri)) piv请参阅SQL Fiddle with Demo。编辑#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)) srcpivot(   sum(value)   for dateweek in (Mon, Tue, Wed, Thu, Fri)) piv
打开App,查看更多内容
随时随地看视频慕课网APP