Id 班级 老师 任职日期
1 1 张 2012-01-02
2 1 李 2012-04-02
3 1 王 2012-05-02
4 2 刘 2012-02-02
5 2 赵 2012-05-02
------------------------------------------------------------
如上结果集,我想查出的结果为这样:
班级 老师 任职日期 老师 任职日期 老师 任职日期
1 张 2012-01-02 李 2012-04-02 王 2012-05-02
2 刘 2012-02-02 赵 2012-05-02 NULL NULL
------------------------------------------------------------
其中每种班级的行数不确定,以最多行数的班级为准,不够的为NULL
比如班级1有3行,班级2有2行,则以班级1为准。(其中每种班级的行数不确定)相当于纵向变横向排列了,而且按日期先后。请问怎么做。
1 1 张 2012-01-02
2 1 李 2012-04-02
3 1 王 2012-05-02
4 2 刘 2012-02-02
5 2 赵 2012-05-02
------------------------------------------------------------
如上结果集,我想查出的结果为这样:
班级 老师 任职日期 老师 任职日期 老师 任职日期
1 张 2012-01-02 李 2012-04-02 王 2012-05-02
2 刘 2012-02-02 赵 2012-05-02 NULL NULL
------------------------------------------------------------
其中每种班级的行数不确定,以最多行数的班级为准,不够的为NULL
比如班级1有3行,班级2有2行,则以班级1为准。(其中每种班级的行数不确定)相当于纵向变横向排列了,而且按日期先后。请问怎么做。
解决方案 »
- 把SQL里表BUS_InvestigateTable中字段为ZDAtt_ZDNum1ber和ZDAtt_PrepZDNumber两列中开头为2-的改为1-,比如2-5-5-1改为1-5-5-1,量比较大
- 关于struts+hibernate+spring用mysql数据库实现的问题
- 再次求教。SQL存储过程的问题。
- sql server2008安装问题
- 急等----各位帮忙,如何添加一个sql server的用户名和密码
- 对于msdn上某个例子的不解!!
- 这样的查询sql怎么写? 在线
- 急,库恢复的问题
- 关于Sql Server 2005安装的问题
- exec sql set isolation to dirty read? 我在介绍SQL语言的书中找不到相关内容,也不理解这是什么意思?
- 当某个字段超过某个值时候就自动预警怎么做?
- 这种情况SQL语句要怎么写?(插入、删除、更新)
go
create table [tb]([Id] int,[班级] int,[老师] varchar(2),[任职日期] datetime)
insert [tb]
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'
godeclare @sql varchar(8000)
select
@sql=isnull(@sql+',','')
+'max(case when rn='+ltrim(rn)+' then 老师 end) as [老师'+ltrim(rn)+'],'
+'max(case when rn='+ltrim(rn)+' then convert(varchar(10),任职日期,120) end) as [任职日期'+ltrim(rn)+']'
from(
select distinct rn=(select count(1) from tb where 班级=t.班级 and id<=t.id) from tb t
) t2exec ('select 班级,'+@sql+' from ('
+'select *,rn=(select count(1) from tb where 班级=t.班级 and id<=t.id) from tb t) t2'
+' 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(2 行受影响)
**/
--> 测试数据:[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
*/