SQL Server 2008 中的 PIVOT SQL 数据
Posted
技术标签:
【中文标题】SQL Server 2008 中的 PIVOT SQL 数据【英文标题】:PIVOT SQL data in SQL Server 2008 【发布时间】:2020-06-30 12:18:39 【问题描述】:我需要在 SQL Server 2008 中透视数据。有人可以给我一些建议吗?
我的原始数据如下所示:
create table #tbl (
ServiceDesc_2 varchar(20), ListCode_2 varchar(10), LongestWaitingDays_2 int, AvgWaitingDays_2 int, TotalPatientsWaiting_2 int);
insert #tbl
select 'XYZ - Left Side', 'Booked', 67, 16, 38
union all
select 'XYZ - Left Side', 'UnBooked', 23, 6, 53
union all
select 'XYZ - Right Side', 'Booked', 14, 8, 2
union all
select 'XYZ - Right Side', 'UnBooked', 4, 3, 2
我正在努力实现以下目标:
【问题讨论】:
SSMS 只是一个客户端工具,而不是数据库本身。你问的(合并的单元格)更适合报表引擎。在 SQL 中,您需要像LAG()
这样的功能来查找前一个单元格的样子。这是在以后的版本中引入的。不再支持 SQL Server 2008。其实最早还在主流支持的版本是SQL Server 2016
【参考方案1】:
您可以使用cross apply
准备数据以将行相乘以复制列。
然后您可以执行条件聚合以获得所需的结果。
这是一个应该可以工作的示例查询:
;with c as
(
select ServiceDesc_2,col,val as measures,ListCode_2,ord
from #tbl
cross apply
(
values
('LongestWaitingDays_2' ,LongestWaitingDays_2 , 1)
,('AvgWaitingDays_2' ,AvgWaitingDays_2 , 2)
,('TotalPatientsWaiting_2',TotalPatientsWaiting_2, 3)
)
CS (col,val,ord)
)
select
ServiceDesc_2
,col as Measures
,MAX(case when ListCode_2='UnBooked' then measures else null end) as UnBooked
,MAX(case when ListCode_2='Booked' then measures else null end) as Booked
from c
group by ServiceDesc_2, col
order by ServiceDesc_2, max(ord)
输出:
【讨论】:
感谢安德里亚的帮助。我以前没有使用过 Cross apply。我收到错误“关键字“值”附近的语法不正确。”我正在复制您之前编写的确切代码。你能帮忙吗? @Namish VALUES(或表值构造函数)是在 SQL Server 2008 中引入的,因此使用它应该没有问题。请检查您的数据库的兼容性级别(它是 SQL Server 2008,所以应该是 100)以上是关于SQL Server 2008 中的 PIVOT SQL 数据的主要内容,如果未能解决你的问题,请参考以下文章
在 MS SQL Server 2008 的 Pivot 中计算水平总计
SQL Server 2008 R2 使用 PIVOT 和 varchar 列不起作用
如何在 Sql Server 2008 R2 中将列转换为行?