日期:2014-05-18  浏览次数:20572 次

求一条SQL语句,有点难度
请教个问题:
有两个表,
A表字段
SID,F1,F2,....
B表字段
ID,SID(对应A的SID),T,V

现在是这样的,A表记录的是一个任务的一些属性,
B表记录的是这个任务的工作时间,其中时间有很都中,比如有技术,交流,调查等(种类用T区别,V代表时间)
现在要得到的结果是这样的

SID,F1,F2...,V1,V2,V3...
这边的   V1,v2,v2是根绝T区别出来的,但是都属于SID这个任务的时间,
请问下应该怎么写查询语句,
就是说把属于任务SID的所有分类的时间也一起查询出来显示在结果表的字段中

请适当考虑下性能,自己写了条SQL语句,但是不是很满意,怕给大家思维定势了,所以不把自己写的发出来了。先谢过大家了!


------解决方案--------------------
create table A(SID int, F1 int, F2 int)
insert into A values(1, 2, 3)
insert into A values(2, 2, 1)
insert into A values(3, 3, 2)
create table B(BID int, SID int, T int, V int)
insert into B values(1, 1, 1, 4)
insert into B values(2, 1, 2, 2)
insert into B values(3, 2, 1, 3)
insert into B values(4, 2, 2, 4)
insert into B values(5, 3, 1, 5)
insert into B values(6, 3, 2, 2)
go

--静态SQL,即t的值固定为1,2
select sid,f1,f2,
max(case when t = 1 then v else 0 end) v1,
max(case when t = 2 then v else 0 end) v2
from
(
select a.*,b.t,b.v from a,b where a.sid = b.sid
) t
group by sid,f1,f2

--动态sql,即T的值不固定
declare @sql varchar(8000)
set @sql = 'select SID , F1 , F2 '
select @sql = @sql + ' , sum(case t when ' ' ' + cast(t as varchar) + ' ' ' then v else 0 end) [V ' + cast(t as varchar) + '] '
from (select distinct t from (select a.sid,a.f1,a.f2,b.t,b.v from a,b where a.sid = b.sid) m) as a
set @sql = @sql + ' from (select a.sid,a.f1,a.f2,b.t,b.v from a,b where a.sid = b.sid) m group by SID , F1 , F2 '
exec(@sql)

drop table A,B

/*
sid f1 f2 v1 v2
----------- ----------- ----------- ----------- -----------
1 2 3 4 2
2 2 1 3 4
3 3 2 5 2

(所影响的行数为 3 行)

SID F1 F2 V1 V2
----------- ----------- ----------- ----------- -----------
1 2 3 4 2
2 2 1 3 4
3 3 2 5 2
*/
------解决方案--------------------
select a.sid,a.f1,a.f2,
max(case when t=1 then b.v else null end )as v1,
max(case when t=2 then b.v else null end )as v2
from a ,b
where a.id =b.sid
group by a.sid,a.f1,a.f2

这个语句效率还可以的。(刚才的语句少了“when”)