我的表内容如下:
ID          RQ   NR
1 2007-02 aa
2 2007-02 数b
3 2007-03 数c
4 2007-03 数d学
5 2007-04 数d学
6 2007-04 数f学
7 2007-05 数f学
8 2007-05 数s学
9 2007-05 数森s学
想实现根据选择的日期动态生成如下结果,如:选择的RQ1是2007-02,RQ2是2007-04,就自动生产
2007-02    2007-03     2007-04
  2           2           2(记录数)
如选择的是2007-03和2007-05就生成如下结果:
2007-03      2007-04    2007-05
  2            2           3

解决方案 »

  1.   

    create table tb(id char(4),name nvarchar(10),dt nvarchar(20))
    insert tb select '1000', '甲' ,'3月1日'  
    insert tb select '1001', '甲', '3月1日'  
    insert tb select '1002', '甲', '3月3日' 
    insert tb select '1003', '乙', '3月2日' 
    insert tb select '1004', '丁', '3月2日' 
    insert tb select '1005', '甲', '3月4日' 
    insert tb select '1006', '乙', '3月1日'  
    insert tb select '1007', '乙', '3月2日' 
    insert tb select '1008', '甲', '3月1日' 
    insert tb select '1009', '丁', '3月1日' 
    insert tb select '1010', '甲', '3月3日'declare @sql nvarchar(4000)
    declare @dt_begin varchar(10),@dt_end varchar(10)--在这设置起始和结束日期
    set @dt_begin='3-1'
    set @dt_end='3-4'set @sql='select name'
    select @sql=@sql+',sum(case when dt='''+dt+''' then 1 else 0 end) ['+dt+']'
    from 
    (
      select distinct *
      from (select dt,'1900-'+replace(replace(dt,'月','-'),'日','') dat
            from tb) tt
      where dat between '1900-'+@dt_begin and '1900-'+@dt_end
    ) tset  @sql=@sql+' from (select *,''1900-''+replace(replace(dt,''月'',''-''),''日'','''') dat
                           from tb) ta where dat between ''1900-'+@dt_begin+''' and ''1900-'+@dt_end+''' group by name order by name'exec (@sql)drop table tb/*
    name       3月1日        3月2日        3月3日        3月4日
    ---------- ----------- ----------- ----------- -----------
    丁          1           1           0           0
    甲          3           0           2           1
    乙          1           2           0           0(3 行受影响)
    */
      

  2.   

    用动态语句生成!
    --设表名为tb
    declare @lstr varchar(8000),@rq1 char(7),@rq2 char(7)
    --假设@rq1<=@rq2
    set @lstr='select (select count(*) from tb where rq='''+@rq1+''' ['+@rq1+']'
    while @rq1<@rq2 
    begin
    set @rq1=convert(char(7),dateadd(mm,1,convert(datetime,@rq1+'-1',120)),120)
    set @lstr=@lstr+',(select count(*) from tb where rq='''+@rq1+''' ['+@rq1+']'
    end
    exec (@lstr)