SQL转置全表

Posted

技术标签:

【中文标题】SQL转置全表【英文标题】:SQL transpose full table 【发布时间】:2013-02-24 05:20:34 【问题描述】:

我需要在 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

当只有一列 (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

任何帮助将不胜感激。

【问题讨论】:

Simple way to transpose columns and rows in Sql?的可能重复 【参考方案1】:

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

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

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 APPLYVALUES 来取消透视数据。您的代码将更改为以下内容:

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

见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)
) src
pivot
(
  sum(value)
  for dateweek in (Mon, Tue, Wed, Thu, Fri)
) piv

【讨论】:

感谢您的快速回答。我无法对以下查询进行反透视:选择 LEFT(datename(dw,datetime),3) 作为 DateWeek,SUM(ACalls) 作为 A,SUM(BCalls) 作为 B from _online_interval_data group by LEFT(datename(dw ,datetime),3) Unpivot(=关键字“Unpivot”附近的语法不正确) 我正在使用 SQL2008 R2。 Cross apply -> select LEFT(datename(dw,datetime),3) as DateWeek, SUM(ACalls) as A, SUM(BCalls) as B from data group by LEFT(datename(dw,datetime), 3) 交叉应用(=关键字'cross'附近的语法不正确) @user2148939 我不明白您发布的代码。请使用您的表格结构和您正在使用的代码编辑您的原始帖子。 列“col”似乎是按字母顺序排列的。如何更改 C、B、A 的降序或 A、C、B 等其他顺序? 但是如果你想要另一个订单呢?例如,如果 'col' 是月份的名称。您不希望它们像 4 月、8 月、12 月那样订购……您希望它们像 1 月、2 月、3 月那样订购……您如何保持这种顺序?

以上是关于SQL转置全表的主要内容,如果未能解决你的问题,请参考以下文章

一道SQL面试题——表行列数据转换(表转置)

关于sql 表 转置 相关的请教!

java 链表转置

java 链表转置

PostgreSQL 交叉表转置行到列

更新 MS Access 表转置结构和更新字段