为了账号安全,请及时绑定邮箱和手机立即绑定

SQL转置全表

SQL转置全表

达令说 2019-08-08 16:45:49
SQL转置全表我需要在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)时怎么做,但是当有多列要转置时我无法弄清楚怎么做(A,B,...)要转置的示例代码:select LEFT(datename(dw,datetime),3) as DateWeek,   sum(ACalls) as A,   Sum(BCalls) as B from DataTablegroup by LEFT(datename(dw,datetime),3)表结构:Column DataTypeDateTime DatetimeACalls intBCalls int任何帮助都感激不尽。
查看完整描述

1 回答

?
慕哥9229398

TA贡献1877条经验 获得超6个赞

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

UNPIVOT函数接受AB列并将结果转换为行。然后,您将使用该PIVOT函数将day值转换为列:

select *from(
  select day, col, value  from yourtable  unpivot
  (
    value    for col in (A, B)
  ) unpiv) srcpivot(
  max(value)
  for day in (Mon, Tue, Wed, Thu, Fri)) piv

请参阅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)) srcpivot(
  max(value)
  for day in (Mon, Tue, Wed, Thu, Fri)) piv

请参阅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)) srcpivot(
  sum(value)
  for dateweek in (Mon, Tue, Wed, Thu, Fri)) piv


查看完整回答
反对 回复 2019-08-08
  • 1 回答
  • 0 关注
  • 1009 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信