SQL SERVER 动态行转列代码

在实际的项目操作中,数据统计偶尔会用到SQLServer的行转列,

数据表MG_TicketsHistoryData如下:

列名数据类型描述
TicketDatedate
TicketCode

nchar(10)

TicketADJClosedecimal(18,2)

使用SQLServer动态行转列,代码如下:

CREATE proc [dbo].[PIVOT_TicketsHisData]
@start_date varchar(10),@end_date varchar(10)
as

DECLARE @columns NVARCHAR(MAX),@isnullcolumns NVARCHAR(MAX), @sql NVARCHAR(MAX);
SELECT @columns = STUFF((SELECT ',' + QUOTENAME(RTRIM(TicketCode)) 
                    FROM MG_TicketsHistoryData 
                    GROUP BY TicketCode
                    ORDER BY TicketCode
                    FOR XML PATH(''), TYPE
                    ).value('.', 'NVARCHAR(MAX)'), 1, 1, '');
SELECT @isnullcolumns = STUFF((SELECT ',isnull(' + QUOTENAME(RTRIM(TicketCode))+',0) as ' +QUOTENAME(RTRIM(TicketCode))
                    FROM MG_TicketsHistoryData 
                    GROUP BY TicketCode
                    ORDER BY TicketCode
                    FOR XML PATH(''), TYPE
                    ).value('.', 'NVARCHAR(MAX)'), 1, 1, ''); 
SET @sql = 'SELECT TicketDate as date, ' + @isnullcolumns + ' FROM 
            (
                SELECT TicketDate, TicketCode,TicketADJClose
                FROM MG_TicketsHistoryData where TicketDate>='''+@start_date+''' and TicketDate<='''+@end_date+'''
            ) x
            PIVOT 
            (
                SUM(TicketADJClose)
                FOR TicketCode IN (' + @columns + ')
            ) p order by p.TicketDate';

EXEC sp_executesql @sql;

调用存储过程语句:

exec PIVOT_TicketsHisData '2022-01-01','2024-01-01'

行转列前的数据截图如下:

行转列后的数据截图如下:

  • 9
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值