sqlserver多行转一行

本文介绍了一个使用SQL进行复杂数据查询的案例,通过动态拼接SQL语句的方式实现了按班级分组并展示每个班级中所有老师的姓名及其最晚任职日期的需求。此方法适用于需要将多个字段按类别聚合显示的情况。

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

http://topic.youkuaiyun.com/u/20120705/11/e3c6d860-a46c-475c-808e-859475e9ad45.html?r=79037815

--> 测试数据:[test]
if object_id('[test]') is not null 
drop table [test]
create table [test](
[Id] int,
[班级] int,
[老师] varchar(2),
[任职日期] datetime
)
go
insert [test]
select 1,1,'','2012-01-02' union all
select 2,1,'','2012-04-02' union all
select 3,1,'','2012-05-02' union all
select 4,2,'','2012-02-02' union all
select 5,2,'','2012-05-02'
go


declare @str varchar(2000)
set @str=''
select 
    @str=@str+',[教师'+LTRIM(px)+']=max(case when px='+LTRIM(px)
    +' then [老师] else null end),[任职日期'
    +LTRIM(px)+']=max(case when px='+LTRIM(px)+' then convert(varchar(10),任职日期,120) else null end)'
from
    (
    select 
        px=ROW_NUMBER()over(partition by [班级] order by id),
        *
    from
        test
    )t
group by
    px
exec('select [班级]'+@str+' from(select 
        px=ROW_NUMBER()over(partition by [班级] order by id),
        *
    from
        test)t group by [班级]')
/*
班级    教师1    任职日期1    教师2    任职日期2    教师3    任职日期3
1    张    2012-01-02    李    2012-04-02    王    2012-05-02
2    刘    2012-02-02    赵    2012-05-02    NULL    NULL
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值