1、a表:
代码 出现日期 成交量
A001 2005-5-1 1
A002 2005-5-3 2
A001 2005-6-3 3
A002 2005-6-4 4
A001 2005-5-1 5
A002 2005-5-3 6
A001 2005-6-3 7
A002 2005-6-4 8
A001 2005-6-5 9
A002 2005-6-6 10
A001 2006-7-9 11
A002 2006-7-9 12
2。要求从a表中生成b表:
时间范围:从2005-5-1  到2005-6-6
统计这个时间范围的代码出现的总次数,并把各自的成交量从小到大排列,检索出前三个最小成交量和相应出现的日期。
正确的手工结果如下:
代码 出现总次数 开始日期 截至日期 最小的成交量 最小成交量出现日期 次最小的成交量 次最小的成交量出现日期 再次最小的成交量 再次最小的成交量出现日期
A001 5 2005-5-1 2005-6-6 1 2005-5-1 3 2005-6-3 5 2005-5-1
A002 5 2005-5-1 2005-6-6 2 2005-5-3 4 2005-6-4 6 2005-5-3

解决方案 »

  1.   

    if object_id('pubs..t1') is not null
       drop table t1
    go
    if object_id('pubs..t2') is not null
       drop table t2
    go
    create table t1
    (
    代码     varchar(10),
    出现日期 datetime,
    成交量   int
    )
    insert into t1(代码,出现日期,成交量) values('A001','2005-5-1',1)
    insert into t1(代码,出现日期,成交量) values('A002','2005-5-3',2)
    insert into t1(代码,出现日期,成交量) values('A001','2005-6-3',3)
    insert into t1(代码,出现日期,成交量) values('A002','2005-6-4',4)
    insert into t1(代码,出现日期,成交量) values('A001','2005-5-1',5)
    insert into t1(代码,出现日期,成交量) values('A002','2005-5-3',6)
    insert into t1(代码,出现日期,成交量) values('A001','2005-6-3',7)
    insert into t1(代码,出现日期,成交量) values('A002','2005-6-4',8)
    insert into t1(代码,出现日期,成交量) values('A001','2005-6-5',9)
    insert into t1(代码,出现日期,成交量) values('A002','2005-6-6',10)
    insert into t1(代码,出现日期,成交量) values('A001','2005-7-9',11)
    insert into t1(代码,出现日期,成交量) values('A002','2005-7-9',12)
    godeclare @dt1 as varchar(10)
    declare @dt2 as varchar(10)set @dt1 = '2005-05-01'
    set @dt2 = '2005-06-06'select px = (select count(1) from t1 where 代码 = a.代码 and 成交量 <a.成交量) + 1 , * into t2 from t1 a
    where 出现日期 >= @dt1 and 出现日期 <= @dt2
    order by 代码 , 成交量
    delete from t2 where px > 3declare @sql varchar(8000)
    set @sql = ''
    select @sql = @sql + ', max(case when px = ''' + cast(px as char(1)) + ''' then 成交量 else null end) as 成交量' + cast(px as char(1)) + 
                         ', max(case when px = ''' + cast(px as char(1)) + ''' then convert(varchar(10),出现日期,120) else null end) as 出现日期' + cast(px as char(1))
    from t2 group by px order by pxset @sql = 'select a.代码 , a.出现总次数 , 开始日期 = ''' + @dt1 + ''' , 截至日期 = ''' + @dt2 + ''' , b.成交量1 as 最小的成交量 , b.出现日期1 as 最小成交量出现日期 , b.成交量2 as 次最小的成交量 , b.出现日期2 as 次最小的成交量出现日期 , b.成交量3 as 再次最小的成交量 , b.出现日期3 as 再次最小的成交量出现日期 from ' + 
               '(select 代码 , count(*) as 出现总次数 from t1 where 出现日期 >= ''' + @dt1 + ''' and 出现日期 <= ''' + @dt2 + ''' group by 代码 ) a ,' + 
               '(select 代码 ' + @sql + ' from t2 group by 代码) b ' +
               'where a.代码 = b.代码'EXEC(@sql)drop table t1
    drop table t2