SQL转置全表

Sel*_*rac 19 sql sql-server pivot unpivot

我需要在MS SQL中进行以下转置

从:

Day  A  B 
---------
Mon  1  2
Tue  3  4
Wed  5  6
Thu  7  8
Fri  9  0
Run Code Online (Sandbox Code Playgroud)

以下内容:

Value Mon Tue Wed Thu Fri 
--------------------------
A      1   3   5   7   9
B      2   4   6   8   0
Run Code Online (Sandbox Code Playgroud)

我知道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)
Run Code Online (Sandbox Code Playgroud)

表结构:

Column DataType
DateTime Datetime
ACalls int
BCalls int
Run Code Online (Sandbox Code Playgroud)

任何帮助都感激不尽.

Tar*_*ryn 27

为了将数据转换为您想要的结果,您需要同时使用UNPIVOTPIVOT函数.

UNPIVOT函数接受AB列并将结果转换为行.然后,您将使用该PIVOT函数将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
Run Code Online (Sandbox Code Playgroud)

请参阅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)
) src
pivot
(
  max(value)
  for day in (Mon, Tue, Wed, Thu, Fri)
) piv
Run Code Online (Sandbox Code Playgroud)

请参阅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)
) src
pivot
(
  sum(value)
  for dateweek in (Mon, Tue, Wed, Thu, Fri)
) piv
Run Code Online (Sandbox Code Playgroud)