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】:为了将数据转置为您想要的结果,您需要同时使用UNPIVOT
和PIVOT
函数。
UNPIVOT
函数采用A
和B
列并将结果转换为行。然后您将使用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 APPLY
和 VALUES
来取消透视数据。您的代码将更改为以下内容:
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转置全表的主要内容,如果未能解决你的问题,请参考以下文章