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
为了将数据转换为您想要的结果,您需要同时使用UNPIVOT和PIVOT函数.
该UNPIVOT函数接受A和B列并将结果转换为行.然后,您将使用该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 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)
编辑#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)