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 数据的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Server 2008 中使用 PIVOT

在 MS SQL Server 2008 的 Pivot 中计算水平总计

SQL Server 2008 R2 使用 PIVOT 和 varchar 列不起作用

如何在 Sql Server 2008 R2 中将列转换为行?

获取 ROWS 作为 COLUMNS(SQL Server 动态 PIVOT 查询)

将txt文件导入sql server 2008数据库中,出现警告 0x80049304: