SQL转置完整表

前端之家收集整理的这篇文章主要介绍了SQL转置完整表前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要在MS sql中进行以下转置

从:

  1. Day A B
  2. ---------
  3. Mon 1 2
  4. Tue 3 4
  5. Wed 5 6
  6. Thu 7 8
  7. Fri 9 0

以下内容

  1. Value Mon Tue Wed Thu Fri
  2. --------------------------
  3. A 1 3 5 7 9
  4. B 2 4 6 8 0

我知道如何使用PIVOT,当只有一列(A),但我不知道如何做,当有多个列要转置(A,B,…)

要转置的示例代码

  1. select LEFT(datename(dw,datetime),3) as DateWeek,sum(ACalls) as A,Sum(BCalls) as B
  2. from DataTable
  3. group by LEFT(datename(dw,3)

表结构:

  1. Column DataType
  2. DateTime Datetime
  3. ACalls int
  4. BCalls int

任何帮助将不胜感激.

解决方法

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

UNPIVOT函数采用A和B列,并将结果转换为行.然后,您将使用PIVOT函数将日期值转换为列:

  1. select *
  2. from
  3. (
  4. select day,col,value
  5. from yourtable
  6. unpivot
  7. (
  8. value
  9. for col in (A,B)
  10. ) unpiv
  11. ) src
  12. pivot
  13. (
  14. max(value)
  15. for day in (Mon,Tue,Wed,Thu,Fri)
  16. ) piv

SQL Fiddle with Demo.

如果您使用sql Server 2008,那么可以使用CROSS APPLY与VALUES来解除数据.您的代码将更改为以下内容

  1. select *
  2. from
  3. (
  4. select day,value
  5. from yourtable
  6. cross apply
  7. (
  8. values ('A',A),('B',B)
  9. ) c (col,value)
  10. ) src
  11. pivot
  12. (
  13. max(value)
  14. for day in (Mon,Fri)
  15. ) piv

SQL Fiddle with Demo.

编辑#1,将您当前的查询应用到上述解决方案中,您将使用类似于此的内容

  1. select *
  2. from
  3. (
  4. select LEFT(datename(dw,value
  5. from DataTable
  6. cross apply
  7. (
  8. values ('A',ACalls),BCalls)
  9. ) c (col,value)
  10. ) src
  11. pivot
  12. (
  13. sum(value)
  14. for dateweek in (Mon,Fri)
  15. ) piv

猜你在找的MsSQL相关文章