我需要在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,3)
表结构:
- Column DataType
- DateTime Datetime
- ACalls int
- BCalls int
任何帮助将不胜感激.
解决方法
为了将数据转换成您想要的结果,您将需要同时使用
UNPIVOT
和
PIVOT
功能.
UNPIVOT函数采用A和B列,并将结果转换为行.然后,您将使用PIVOT函数将日期值转换为列:
- 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 Server 2008,那么可以使用CROSS APPLY与VALUES来解除数据.您的代码将更改为以下内容:
- select *
- from
- (
- select day,value
- from yourtable
- cross apply
- (
- values ('A',A),('B',B)
- ) c (col,value)
- ) src
- pivot
- (
- max(value)
- for day in (Mon,Fri)
- ) piv
编辑#1,将您当前的查询应用到上述解决方案中,您将使用类似于此的内容:
- select *
- from
- (
- select LEFT(datename(dw,value
- from DataTable
- cross apply
- (
- values ('A',ACalls),BCalls)
- ) c (col,value)
- ) src
- pivot
- (
- sum(value)
- for dateweek in (Mon,Fri)
- ) piv