行变列

本文介绍了一种使用T-SQL动态构建复杂查询的方法,通过示例展示了如何为不同的时间点选择最大日期值,并以特定格式展示结果。此方法适用于需要灵活生成报表或其他需要动态聚合数据的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


CREATE TABLE ##test (projectname varchar(10),[TIME] datetime)
INSERT INTO ##test
SELECT '四门子', '2012-07-04'
UNION ALL
SELECT '四门子', '2012-08-21'
UNION ALL
SELECT '四门子', '2012-09-30'
UNION ALL
SELECT '来福', '2012-07-04'
UNION ALL
SELECT '来福', '2012-08-21'
UNION ALL
SELECT '来福', '2012-09-30'
UNION ALL
SELECT '来福', '2012-10-21'
UNION ALL
SELECT '来福', '2012-10-30'


declare @s nvarchar(4000)
set @s=''

Select     @s=@s+','+quotename(time)+'=max(case when [time]='+quotename([time],'''')+' then [time] else null end)'
from ##test group BY time
print('select projectname'+@s+' from ##test group by projectname')
exec('select projectname'+@s+' from ##test group by projectname')
--print出来的
select projectname,[Jul  4 2012 12:00AM]=max(case when [time]='Jul  4 2012 12:00AM' then [time] else null end),
[Aug 21 2012 12:00AM]=max(case when [time]='Aug 21 2012 12:00AM' then [time] else null end),
[Sep 30 2012 12:00AM]=max(case when [time]='Sep 30 2012 12:00AM' then [time] else null end),
[Oct 21 2012 12:00AM]=max(case when [time]='Oct 21 2012 12:00AM' then [time] else null end),
[Oct 30 2012 12:00AM]=max(case when [time]='Oct 30 2012 12:00AM' then [time] else null end)
from test group by projectname
-- drop table ##test
/*
来福 2012-07-04 00:00:00.000 2012-08-21 00:00:00.000 2012-09-30 00:00:00.000 2012-10-21 00:00:00.000 2012-10-30 00:00:00.000
四门子 2012-07-04 00:00:00.000 2012-08-21 00:00:00.000 2012-09-30 00:00:00.000 NULL NULL
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值