我写了一个存储过程 xxx
参数是 年 开始月份  结束月份 开始科目 结束科目 开始部门 结束部门执行结果是:
部门  科目  比率  比如我EXEC XXX '2008','1','1','100','200','001','008'结果会出来
部门  科目  比率
A    车费  0.2
A    补贴  0.8
B    车费  0.5
B    补贴  0.7
...   ...当然 我月份的参数变过 比如做2到2
就会查出2月份的比率现在我想另外写个存储过程  PPP
参数是  年  开始科目  结束科目  开始部门 结束部门
执行结果形同是:
部门  科目  一月  二月  三月 四月...十二月
A    车费  0.2  0.4   0.1 0.4 ...0.7
A    补贴  0.8  0.4   1.2 0.4 ...0.5
B    车费  0.5  0.4   0.1 0.5 ...0.7
B    补贴  0.7  0.2   0.3 0.4 ...0.8
...  ...   ...  ...这个存储过程怎么写呢?
特别是月份连续做字段怎么写?

解决方案 »

  1.   

    自己根据这个改改..
    数据表Mytable 
    WorkID   Name     SaleDate     DayCount 
    001      张三     2008-01-01     3 
    002      李四     2008-01-10     5 
    001      张三     2008-01-20     1 
    003      老王     2008-01-20     2 
    001      张三     2008-04-01     6 
    002      李四     2008-04-02     7 
    004      小强     2008-04-03     8 
    要求按月输出明细: 
    2008-01明细: 
    WorkID   Name   2008-01-01   2008-01-02  2008-01-03  2008-01-04   ...... 2008-01-31   
    001      张三     3              0           0         0            0      
    002      李四     0              0           0         0            0          
    003      老王     0              0           0         0            0          
    004      小强     0              0           0         0            0         答:创建存储过程,动态生成SQL即可create proc p_test @date varchar(10)
    as
        declare @sql varchar(8000)
        declare @i int       select @sql='select WorkID,Name',@i=1
        
        while 1=1
        begin
           select @sql=@sql+',sum(case when convert(char(10),SaleDate,120)='''+(@date+'-'+right('00'+ltrim(@i),2))+''' then DayCount else 0 end) ['+(@date+'-'+right('00'+ltrim(@i),2))+']',
               @i=@i+1
           if @i>day(dateadd(day,-1,dateadd(month,1,@date+'-1'))) break
        end
        exec (@sql+' from tb group by WorkID,Name order by WorkID')
    go
    exec p_test '2008-04'
      

  2.   

    你好  按照你的写法我初步改了一下
    create proc p_test @date varchar(10)
    as
        declare @sql varchar(8000)
        declare @i int       select @sql='select 科目代码,科目名称,部门代码,部门',@i=1
        
        while 1=1
        begin
           select @sql=@sql+',sum(case when convert(char(10),月份,120)='''+(@date+'-'+right('00'+ltrim(@i),2))+''' then 比率 else 0 end) ['+right('00'+ltrim(@i),2))+']',
               @i=@i+1
           if @i>month(dateadd(month,-1,dateadd(year,1,@date+'-1'))) break
        end
        exec (@sql+' from tb group by 科目代码,部门 order by 科目代码')
    goexec p_test '2008'
    但是问题是
    我怎么样根据存储过程 xxx 
    参数是 年 开始月份  结束月份 开始科目 结束科目 开始部门 结束部门 执行结果是: 
    部门  科目  比率  比如我EXEC XXX '2008','1','1','100','200','001','008' 结果会出来 
    部门  科目  比率 
    A    车费  0.2 
    A    补贴  0.8 
    B    车费  0.5 
    B    补贴  0.7 
    ...  ... 当然 我月份的参数变过 比如做2到2 
    就会查出2月份的比率 
    那么我怎么样先得到以下这张表?
    科目代码  科目  部门代码 部门     月份      比率
    001      车费  01.01   A      2008-01   0.2
    002      补贴  01.01   A     2008-02   0.6
    ...      ...  ....       ....
      

  3.   

    create table tt(科目代码 varchar(3) , 科目 varchar(4), 部门代码 varchar(5), 部门  varchar(4) ,  月份  varchar(7)   , 比率 varchar(10))
    insert into tt select '001',      '车费',  '01.01',  'A',    '2008-01',  '0.2' 
    insert into tt select '002',      '补贴',  '01.01',  'A',    '2008-02',  '0.6' 
    declare @sql varchar(1000),@year varchar(10)
    set @year='2008'
    set @sql='select 部门 '
    select @sql=@sql+',max(case when right(月份,2)='''+right(月份,2)+''' then 比率 else null end) as ['+right(月份,2)+'月]'
    from (select distinct 月份 from tt) as aa
    set @sql=@sql+' from tt where left(月份,4)='+@year+' group by 部门 '
    print @sql
    exec(@sql)部门   01月        02月
    ---- ---------- ----------
    A    0.2        0.6