加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SQL转置完整表

发布时间:2020-12-12 06:24:19 所属栏目:MsSql教程 来源:网络整理
导读:我需要在MS SQL中进行以下转置 从: Day A B ---------Mon 1 2Tue 3 4Wed 5 6Thu 7 8Fri 9 0 以下内容: Value Mon Tue Wed Thu Fri --------------------------A 1 3 5 7 9B 2 4 6 8 0 我知道如何使用PIVOT,当只有一列(A),但我不知道如何做,当有多个列要转置
我需要在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

任何帮助将不胜感激.

解决方法

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

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 Fiddle with Demo.

如果您使用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

见SQL Fiddle with Demo.

编辑#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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读