注:第5题用游标,其它题不能使用游标,所有不能使用临时表
    1.建表
    列车(车次,起始站,终点站,最大运载量)
    车站(车站名,建站日期,所属城市,最大吞吐量)
    列车运行记录(编号,列车名,到达时间,到达站,上车人数,下车人数)
    1.1 建表要有主外键
    1.2 建站日期、到达时间为datetime类型
    1.3 各种人数大于等于0,列车名、到达时间不能为空
    2.插入数据
    列车 (Z1,天津站,济南站,1000) (T8,北京站,天津站,1000) (T104,天津,上海,2000) (T5,济南,上海,2000)
    车站 (北京站,’1988-3-21’,北京,30000)(北京南站,’2002-4-20’,北京,20000) (北京西站,’1990-6-20’,北京,30000) (上海站,’1990-6-20’,上海,25000)(天津站,’1990-6-20’,天津,10000) (济南站,’1990-6-20’,济南,10000) (南京站,’1990-6-20’,南京,20000)
    运行记录(1,T104,5:03,天津站,700,0) (2,T104,8:03,济南站,200,200) (3,T104,11:03,南京站,300,200) (4,T104,15:10,上海站,0,800) (5,Z1,10:00,天津站,600,0) (6,Z1,15:00,济南站,0,600) (7,T8,9:00,北京站,800,0) (8,T8,9:20,天津站,0,800) (9,T5,7:30,济南站,2000,0) (10,T5,10:30,南京站,300,200) (11,T5,14:30,上海站,0,1900)
    3.1哪个城市的车站最多
    3.2停靠站数第二多的车次和它所停靠车站名
    3.3实际运载人数最多的车次
    4.增加一个车次T3,从北京直达上海,6:00出发,13:50到达,最大运载人数为1000人,实际乘坐400人
    5.1假设Z1是从天津开往济南方向的列车,则返程车车次即为Z2,根据现有的列车表里的记录,补返程列车车次
    用如下函数取出车次中的数字部分:convert(integer,substring(‘T3’,2,len(‘T3’)-1))
    5.2列车到达终点后休息一个小时后,原路返程,假设速度不变,补全所有的运行记录
    6.北京到上海最多换乘一次的所有乘车方案
    1.建表
    drop table s888Record
    go
    drop table s888Train
    go
    drop table s888Station
    go
    —列车(车次,起始站,终点站,最大运载量)
    create table s888Train(Tname char(30),Bname char(30),Ename char(30),Mcarry integer,primary key(Tname),check (Mcarry >= 0))
    go
    —车站(车站名,建站日期,所属城市,最大吞吐量)
    create table s888Station(Sname char(30),Cdate datetime,Bcity char(100),Mthruput integer,primary key(Sname),check(Mthruput >= 0))
    go
    —列车运行记录(编号,列车名,到达时间,到达站,上车人数,下车人数)
    create table s888Record(no integer,Tname char(30) not null,Atime datetime not null,Sname char(30),Upamount integer,Offamount integer,primary key(no),
    foreign key(Tname) references s888Train(Tname),foreign key(Sname) references s888Station(Sname),
    check(Upamount >=0 and Offamount >= 0))
    go

    2.
    insert into s888Train values (‘Z1’,’天津站’,’济南站’,1000)
    go
    insert into s888Train values (‘T8’,’北京站’,’天津站’,1000)
    go
    insert into s888Train values (‘T104’,’天津站’,’上海站’,2000)
    go
    insert into s888Train values (‘T5’,’济南站’,’上海站’,2000)
    go
    insert into s888Station values (‘北京站’,’1988-3-21’,’北京’,30000)
    go
    insert into s888Station values (‘北京南站’,’2002-4-20’,’北京’,20000)
    go
    insert into s888Station values (‘北京西站’,’1990-6-20’,’北京’,30000)
    go
    insert into s888Station values (‘上海站’,’1990-6-20’,’上海’,25000)
    go
    insert into s888Station values (‘天津站’,’1990-6-20’,’天津’,10000)
    go
    insert into s888Station values (‘济南站’,’1990-6-20’,’济南’,10000)
    go
    insert into s888Station values (‘南京站’,’1990-6-20’,’南京’,20000)
    go
    insert into s888Record values(1, ‘T104’,’5:03’,’天津站’,700,0)
    go
    insert into s888Record values(2, ‘T104’,’8:03’,’济南站’,200,200)
    go
    insert into s888Record values(3, ‘T104’,’11:03’,’南京站’,300,200)
    go
    insert into s888Record values(4, ‘T104’,’15:10’,’上海站’,0,800)
    go
    insert into s888Record values(5, ‘Z1’,’10:00’,’天津站’,600,0)
    go
    insert into s888Record values(6, ‘Z1’,’15:00’,’济南站’,0,600)
    go
    insert into s888Record values(7, ‘T8’,’9:00’,’北京站’,800,0)
    go
    insert into s888Record values(8, ‘T8’,’9:20’,’天津站’,0,800)
    go
    insert into s888Record values(9, ‘T5’,’7:30’,’济南站’,2000,0)
    go
    insert into s888Record values(10,’T5’,’10:30’,’南京站’,300,200)
    go
    insert into s888Record values(11,’T5’,’14:30’,’上海站’,0,1900)
    go

    3.1
    select Bcity
    from s888Station
    group by Bcity
    having count(Sname) >= all(select count(Sname)
    from s888Station group by Bcity
    )
    go
    —3.2
    select Tname,Sname
    from s888Record
    where Tname = (
    select top 1 Tname from (
    select top 2 Tname,count(Sname) as ct
    from s888Record
    group by Tname
    order by count(Sname) desc
    ) tbl
    order by ct asc
    )
    go
    —3.3
    select Tname
    from s888Record
    group by Tname
    having sum(Upamount) >= all(select sum(upamount)
    from s888Record
    group by Tname)
    go

    4.
    insert into s888Train values (‘T3’,’北京站’,’上海站’,1000)
    go
    insert into s888Record values(12, ‘T3’,’6:00’,’北京站’,400,0)
    go
    insert into s888Record values(13, ‘T3’,’15:50’,’上海站’,0,400)
    go

    5.
    declare @tname char(30)
    declare @bname char(30)
    declare @ename char(30)
    declare @mcarry integer

    declare @no integer
    declare @atime datetime
    declare @sname char(30)

    declare @newname char(30)

    declare @diff integer
    declare @preold datetime —如何定义初始值
    declare @prenew datetime
    declare @newtime datetime

    declare cur1 insensitive cursor for
    select Tname,Bname,Ename,Mcarry
    from s888Train
    for read only

    open cur1
    while(0=0)
    begin
    fetch next from cur1 into @tname,@bname,@ename,@mcarry
    if(@@fetch_status<>0) break
    set @newname=substring(@tname,1,1) + convert(char(29),(convert(integer,substring(@tname,2,len(@tname)-1)) + 1))

    insert into s888Train values(@newname,@ename,@bname,@mcarry)

    set @preold = (select max(atime) from s888Record where tname=@tname)
    set @prenew = dateadd(minute,60,@preold)

    declare cur2 cursor for
    select atime,sname
    from s888Record
    where Tname=@tname
    order by atime desc
    for read only

    open cur2
    while(0=0)
    begin
    fetch next from cur2 into @atime,@sname
    if(@@fetch_status<>0) break

    set @no = (select max(no) from s888Record)
    set @no = @no+1

    set @diff = datediff(minute,@atime,@preold)—得到两个站之间的时间分钟差
    set @newtime=dateadd(minute,@diff,@prenew)

    insert into s888Record values(@no, @newname,@newtime,@sname,0,0)

    set @preold = @atime
    set @prenew = @newtime

    end
    close cur2
    deallocate cur2
    end
    close cur1
    deallocate cur1

    go

    select * from s888Record where tname in(‘T3’,’T4’)
    go

    6.(考虑到’北京站’和’上海站’都可能为中途车站的情况)
    — 直达的情况
    select t1.Tname 车次,t6.sname 起始站,t6.Atime 发车时间,’直达’ 换乘,t7.sname 到达站,t7.atime 到过时间
    from s888Record t1,s888Record t6,s888Record t7
    where t1.Sname=’北京站’
    and exists (
    select 1 from s888Record t2 where t2.Tname = t1.Tname and t2.sname=’上海站’
    )
    and
    (select no from s888Record t4 where t4.Tname = t1.Tname and t4.sname=’北京站’)
    <
    (select no from s888Record t5 where t5.Tname = t1.Tname and t5.sname=’上海站’)
    and t1.Tname = t6.Tname
    and t6.sname = ‘北京站’
    and t1.Tname = t7.Tname
    and t7.sname = ‘上海站’
    —go
    union
    —换乘的情况

    select tbl.Tname 车次,tbl.Bname 起始站,tbl.Atime 发车时间,rtrim(tbl.Extname)+’ 换乘 ‘+rtrim(t3.tname) 换乘,t7.sname 到达站,t7.atime 到过时间
    from s888Record t3,(
    —2.经过如下车站的所有车次
    select t1.Tname,t1.Sname Bname,t1.Atime,t2.sname Extname—1.所有的经过北京的车次所经过的其它的车站:这个子查询是入口
    from s888Record t1,s888Record t2
    where t1.Sname=’北京站’
    and t1.Tname = t2.Tname
    and t2.sname<>’北京站’
    and t2.sname<>’上海站’
    and (select atime from s888record tbl1 where tbl1.Tname=t1.Tname and tbl1.sname=t1.sname)—定位从北京出发的火车,而不是返程车
    <(select atime from s888record tbl2 where tbl2.Tname=t2.Tname and tbl2.sname=t2.sname)
    ) tbl,
    s888record t7
    where tbl.Extname = t3.sname
    and exists(—3.判断这些车次有没有经过上海
    select 1 from s888Record t4 where t3.Tname = t4.Tname and t4.sname = ‘上海站’
    )
    and (select atime from s888Record t5 where t5.sname = t3.sname and t5.tname=t3.tname) —定位从中途站去往上海的车次,而不是返程的车
    < (select atime from s888Record t6 where t6.sname = ‘上海站’ and t6.tname=t3.tname)
    and t3.tname = t7.tname
    and t7.sname = ‘上海站’