SQL转置全表

SQL转置全表,sql,sql-server,pivot,unpivot,Sql,Sql Server,Pivot,Unpivot,我需要在MS SQL中执行以下转置 发件人: 对下列事项: Value Mon Tue Wed Thu Fri -------------------------- A 1 3 5 7 9 B 2 4 6 8 0 select * from ( select day, col, value from yourtable cross apply ( values ('A', A),('B', B) ) c (col

我需要在MS SQL中执行以下转置

发件人:

对下列事项:

Value Mon Tue Wed Thu Fri 
--------------------------
A      1   3   5   7   9
B      2   4   6   8   0
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
我知道当只有一列A时如何使用PIVOT,但当有多列要转置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)
表结构:

Column DataType
DateTime Datetime
ACalls int
BCalls int

任何帮助都将不胜感激。

为了将数据转换为所需的结果,您需要同时使用和函数

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+,则可以使用带值的交叉应用来取消填充数据。您的代码将更改为以下内容:

Value Mon Tue Wed Thu Fri 
--------------------------
A      1   3   5   7   9
B      2   4   6   8   0
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

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

谢谢你的快速回答。我无法为以下查询执行unpivot:选择LEFTdatenamedw、datetime、3作为DateWeek、SUMACalls作为A、SUMBCalls作为B从_online_interval_数据组按LEFTdatenamedw、datetime、3 unpivot=关键字“unpivot”附近的语法不正确我正在使用SQL2008 R2。交叉应用时出现同样的问题->选择LEFTdatenamedw,datetime,3作为DateWeek,SUMACalls作为A,SUMBCalls作为B从数据组中按LEFTdatenamedw,datetime,3交叉应用=关键字“Cross”附近的语法不正确@user2148939我不理解您发布的代码。请用你的表格结构编辑你的原始帖子,然后编辑你正在使用的代码。列“col”似乎是按字母顺序排列的。如何更改降序(如C、B、A)或其他顺序(如A、C、B),但如果需要另一个顺序呢。例如,如果'col'是月份的名称。你不希望他们像4月、8月、12月那样订购,。。。你想要他们像一月,二月,三月,。。。你怎么能维持这张订单?可能是