b.id 的值为 0,1,2,3,4,5,6.........这样从a.订报开始期分别加b.id的值获取每期的期号,如果>b.结束期则终止。

解决方案 »

  1.   

    上贴地址是:
    http://topic.csdn.net/u/20071212/09/e89e3b71-0d7c-4929-b79b-df3dac6b2e60.html
      

  2.   

    [code=SQL]--利用一个临时表.
    create table tb(报刊种类 varchar(10) , 订报开始期 int, 订报结束期 int, 每期订报数 int)
    insert into tb values('小低版' , 1 , 13 , 900) 
    insert into tb values('小中版' , 2 , 26 , 87 )
    insert into tb values('高中版' , 26 , 52 , 45 )
    insert into tb values('小中版' , 1 , 26 , 200)
    goSELECT TOP 100 id = identity(int,0,1) INTO tmp FROM syscolumns a, syscolumns b 
    select * from tmp
    /*
    id          
    ----------- 
    0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ...
    */  select a.报刊种类 , 期数 = a.订报开始期 + b.id , a.每期订报数 from tb a , tmp b where a.订报开始期 + b.id <= a.订报结束期 
    /*
    报刊种类       期数          每期订报数       
    ---------- ----------- ----------- 
    小低版        1           900
    小低版        2           900
    小低版        3           900
    小低版        4           900
    小低版        5           900
    小低版        6           900
    小低版        7           900
    小低版        8           900
    小低版        9           900
    小低版        10          900
    小低版        11          900
    小低版        12          900
    小低版        13          900
    小中版        2           87
    小中版        3           87
    小中版        4           87
    小中版        5           87
    小中版        6           87
    小中版        7           87
    小中版        8           87
    小中版        9           87
    ...
    */--然后对上面结果做行列转换select 期数 , 
      sum(case 报刊种类 when '小低版' then 每期订报数 else 0 end) '小低',
      sum(case 报刊种类 when '小中版' then 每期订报数 else 0 end) '小中',
      sum(case 报刊种类 when '高中版' then 每期订报数 else 0 end) '高中'
    from
    (
      select a.报刊种类 , 期数 = a.订报开始期 + b.id , a.每期订报数 from tb a , tmp b where a.订报开始期 + b.id <= a.订报结束期 
    ) t
    group by 期数
    order by 期数drop table tb,tmp
    /*
    期数          小低          小中          高中          
    ----------- ----------- ----------- ----------- 
    1           900         200         0
    2           900         287         0
    3           900         287         0
    4           900         287         0
    5           900         287         0
    6           900         287         0
    7           900         287         0
    8           900         287         0
    9           900         287         0
    10          900         287         0
    11          900         287         0
    12          900         287         0
    13          900         287         0
    14          0           287         0
    15          0           287         0
    16          0           287         0
    17          0           287         0
    18          0           287         0
    19          0           287         0
    20          0           287         0
    21          0           287         0
    22          0           287         0
    23          0           287         0
    24          0           287         0
    25          0           287         0
    26          0           287         45
    27          0           0           45
    28          0           0           45
    29          0           0           45
    30          0           0           45
    31          0           0           45
    32          0           0           45
    33          0           0           45
    34          0           0           45
    35          0           0           45
    36          0           0           45
    37          0           0           45
    38          0           0           45
    39          0           0           45
    40          0           0           45
    41          0           0           45
    42          0           0           45
    43          0           0           45
    44          0           0           45
    45          0           0           45
    46          0           0           45
    47          0           0           45
    48          0           0           45
    49          0           0           45
    50          0           0           45
    51          0           0           45
    52          0           0           45(所影响的行数为 52 行)*/
    [/code]
      

  3.   

    --也可以不用临时表.因为你的期号最多到52,如果很多就用临时表的办法。
    create table tb(报刊种类 varchar(10) , 订报开始期 int, 订报结束期 int, 每期订报数 int)
    insert into tb values('小低版' , 1 , 13 , 900) 
    insert into tb values('小中版' , 2 , 26 , 87 )
    insert into tb values('高中版' , 26 , 52 , 45 )
    insert into tb values('小中版' , 1 , 26 , 200)
    goselect 期数 , 
      sum(case 报刊种类 when '小低版' then 每期订报数 else 0 end) '小低',
      sum(case 报刊种类 when '小中版' then 每期订报数 else 0 end) '小中',
      sum(case 报刊种类 when '高中版' then 每期订报数 else 0 end) '高中'
    from
    (
      select a.报刊种类 , 期数 = a.订报开始期 + b.id , a.每期订报数 from tb a , 
      (
        select 0 as id union select 1 union select 2 union select 3 union select 4 union select 5  union select 6  union select 7 union
        select 8 id union select 9 union select 10 union select 11 union select 12 union select 13  union select 14  union select 15 union
        select 16 id union select 17 union select 18 union select 19 union select 20 union select 21  union select 22  union select 23 union
        select 24 id union select 25 union select 26 union select 27 union select 28 union select 29  union select 30  union select 31 union
        select 32 id union select 33 union select 34 union select 35 union select 36 union select 37  union select 38  union select 39 union
        select 40 id union select 41 union select 42 union select 43 union select 44 union select 45  union select 46  union select 47 union
        select 48 id union select 49 union select 50
      ) b 
      where a.订报开始期 + b.id <= a.订报结束期 
    ) t
    group by 期数
    order by 期数drop table tb
    /*
    期数          小低          小中          高中          
    ----------- ----------- ----------- ----------- 
    1           900         200         0
    2           900         287         0
    3           900         287         0
    4           900         287         0
    5           900         287         0
    6           900         287         0
    7           900         287         0
    8           900         287         0
    9           900         287         0
    10          900         287         0
    11          900         287         0
    12          900         287         0
    13          900         287         0
    14          0           287         0
    15          0           287         0
    16          0           287         0
    17          0           287         0
    18          0           287         0
    19          0           287         0
    20          0           287         0
    21          0           287         0
    22          0           287         0
    23          0           287         0
    24          0           287         0
    25          0           287         0
    26          0           287         45
    27          0           0           45
    28          0           0           45
    29          0           0           45
    30          0           0           45
    31          0           0           45
    32          0           0           45
    33          0           0           45
    34          0           0           45
    35          0           0           45
    36          0           0           45
    37          0           0           45
    38          0           0           45
    39          0           0           45
    40          0           0           45
    41          0           0           45
    42          0           0           45
    43          0           0           45
    44          0           0           45
    45          0           0           45
    46          0           0           45
    47          0           0           45
    48          0           0           45
    49          0           0           45
    50          0           0           45
    51          0           0           45
    52          0           0           45(所影响的行数为 52 行)*/