CREATE PROCEDURE TRUNC  AS
declare @dt varchar(10)
declare @sql varchar(3000)
declare @sql1 nvarchar(3000)
declare @sql2 nvarchar(3000)declare cr CURSOR for select distinct rq from yy order by rq 
OPEN cr
  FETCH NEXT FROM cr INTO @dt  --****
set @sql=''WHILE @@FETCH_STATUS = 0
BEGIN  set @sql1=@sql1+'sum((case when rq='''+@dt+''' then quantity else 0 end)) as '''+@dt+''','
  set @sql2=@sql2+'sum(a.['+@dt+']),'
 FETCH NEXT FROM cr INTO @dt   --****
ENDset @sql='select customer,'+@sql1+'sum(quantity) as ''合计'' into ti from yy group by customer'  
set @sql=@sql+'union select ''合计'','+@sql2+'sum(a.[合计]) into ti from (' +@sql+') as a order by customer'exec(@sql)CLOSE cr
DEALLOCATE cr
GO

解决方案 »

  1.   

    to j9988(j9988)
    为何要这样改,我的做法错在哪里
      

  2.   

    游标记录指针,
    刚打开时是在第一条记录的前面。
    第一个FETCH NEXT 到第一条记录后面那个就是循环用了
      

  3.   

    游标刚打开时,游标仍处于结果集之外,@@FETCH_STATUS 值为-1
    要用FETCH NEXT 读取游标,使它处于结果集第一行,@@FETCH_STATUS=0
    所以
    你的WHILE @@FETCH_STATUS=0 就不执行循环了,因为@@FETCH_STATUS=-1
      

  4.   

    to j9988(j9988)
    还是不行,不能生成表ti,但也没有报错
      

  5.   

    在END后面加上print @sql1 print @sql2
    在exec(@sql)前加print @sql 看错在那?关把值贴出来!
      

  6.   

    有可能@dt 碰到NULL值,
    另一个@sql2=@sql2+'sum(a.['+@dt+']),'  这个@dt恐怕要用convert转换成年月日的跟你表中字段相同的格式,不然可能会是"2002-02-02 00:00:00.000"
      

  7.   

    我在sql查询分析器输入exec trunc没有信息提示
      

  8.   

    是这边错!
    在set @sql=''
    后面加上:
    set @sql1='' 
    set @sql2=''
      

  9.   

    CREATE PROCEDURE TRUNC  AS
    declare @dt varchar(10)
    declare @sql varchar(3000)
    declare @sql1 nvarchar(3000)
    declare @sql2 nvarchar(3000)declare cr CURSOR for select distinct rq from yy order by rq 
    OPEN cr
      FETCH NEXT FROM cr INTO @dt  --****
    set @sql=''
    set @sql1=''  --***
    set @sql2=''  --***
    WHILE @@FETCH_STATUS = 0
    BEGIN  set @sql1=@sql1+'sum((case when rq='''+@dt+''' then quantity else 0 end)) as '''+@dt+''','
      set @sql2=@sql2+'sum(a.['+convert(varchar(10),@dt,120)+']),'  --*
     FETCH NEXT FROM cr INTO @dt   --****
    ENDset @sql='select customer,'+@sql1+'sum(quantity) as ''合计'' into ti from yy group by customer'  
    set @sql=@sql+'union select ''合计'','+@sql2+'sum(a.[合计]) into ti from (' +@sql+') as a order by customer'exec(@sql)CLOSE cr
    DEALLOCATE cr
    GO
      

  10.   

    sum((case when rq=02  1 2002 then quantity else 0 end)) as 02  1 2002,
    日期2002-2-1变成02  1 2002 ,应该是类型转换错误,应怎样改,日期转换成字符串好象应该是这样
      

  11.   

    set @sql1=@sql1+'sum((case when rq='''+convert(varchar(10),@dt,120)+''' then quantity else 0 end)) as '''+convert(carchar(10),@dt,120)+''','
      

  12.   

    基本解决问题,但还有一个问题,
    SELECT INTO 必须是包含 UNION 运算符的 SQL 语句中的第一个查询。
    有union就不能有into,这个问题有没有的解决,只差这个问题。
      

  13.   

    set @sql=@sql+'insert into ti select ''合计'','+@sql2+'sum(a.[合计])  from (' +@sql+') as a order by customer'
      

  14.   

    set @sql='select customer,'+@sql1+'sum(quantity) as ''合计'' into ti from yy group by customer'  
    set @sql=@sql+'union select ''合计'','+@sql2+'sum(a.[合计]) into ti from (' +@sql+') as a order by customer'-->set @sql='select customer,'+@sql1+'sum(quantity) as ''合计'' into ti from yy group by customer'  
    set @sql=@sql+'union select ''合计'','+@sql2+'sum(a.[合计]) from (' +@sql+') as a order by customer'
      

  15.   

    还是错误。在关键字 'into' 附近有语法错误。
      

  16.   

    insert into ti select '合计',sum(a.['2002-02-01']),sum(a.['2002-02-02']),.....
      

  17.   

    set @sql=@sql+'union select ''合计'','+@sql2+'sum(a.[合计]) from (' +@sql+') as a order by customer'
      

  18.   

    为何不用insert,而用union好象不行
      

  19.   

    你看仔细了......后面的union 处去了into ti
      

  20.   

    我已经去了,我觉得insert into后再union不行,好象union后再into才有可能行
      

  21.   

    set @sql='select customer,'+@sql1+'sum(quantity) as ''合计'' into ti from yy group by customer'  
    set @sql=@sql+'union select ''合计'','+@sql2+'sum(a.[合计]) from (' +@sql+') as a order by customer'
    我试过了的,它的功能是先UNION 后新成一个TI表.