以下疑问:
1、你在填充第一个月的数据前,表中有无记录?有记录是不是就会有三十一条?
2、这样的形式是被允许的吗?fid       ffield11   ffield12     ffield21   ffield22 ....
1         2001-1-1   abc          2001-1-5   dbf
2         2001-1-8   ddd          2001-1-6   ere3、你填充第二个月时是按fid 来update 还是按其他字段来update 4、我感觉好象做这样类似的表可以不必这样复杂,最好将原始记录表结构贴上来,可能有更简单的方法。

解决方案 »

  1.   

    补充一下,
    1.临时表中的31条记录各有一个字段来表示该条记录的记录号.
    2.差不多,为ffield??中只填充具体的日子即可
    fid      ffield11  ffield12    ffield21  ffield22 ....
    1        1           abc        5            dbf
    2        8           ddd        6            ere
    3.填充第二个月时,不是按fid的,只不过在从数据源查找时用了一个order by,在这边填充时只要按顺序填入即可,没必要将具体的日期和fid字段挂钩.
      

  2.   

    日期不需要与FID对应,但是FID与日期的顺序还是有关的。所以还是要将日期排序后的坐次与FID对应进行填充。
    不知道你的语句怎么写的,下面的方法应该比较简单,你试试。一、假设原始表如下:
    select * from testfdate                                                  fprodid    
    ------------------------------------------------------ ---------- 
    2001-01-01 00:00:00.000                                aaa
    2001-01-05 00:00:00.000                                fff
    2001-01-17 00:00:00.000                                ggg
    2001-02-06 00:00:00.000                                fdre
    2001-02-15 00:00:00.000                                33333
    2001-02-07 00:00:00.000                                erer
    2001-02-12 00:00:00.000                                333
    2001-03-05 00:00:00.000                                333
    2001-12-01 00:00:00.000                                34343
    2001-12-15 00:00:00.000                                dddd
    2001-12-12 00:00:00.000                                33666
    2001-12-09 00:00:00.000                                sdf实际的表可能不是这样的结构,但可以转成这种形式的,应该没问题。二、临时表结构如下:
    create table temp
    (fid int ,
    field11 int null,field12 varchar(10) null,
    field21 int null,field22 varchar(10) null,
    field31 int null,field32 varchar(10) null,
    field41 int null,field42 varchar(10) null,
    field51 int null,field52 varchar(10) null,
    field61 int null,field62 varchar(10) null,
    field71 int null,field72 varchar(10) null,
    field81 int null,field82 varchar(10) null,
    field91 int null,field92 varchar(10) null,
    field101 int null,field102 varchar(10) null,
    field111 int null,field112 varchar(10) null,
    field121 int null,field122 varchar(10) null
    )
    且已有三十一条记录,FID从1到31。三、填充过程如下:
    select t1.*,count(t2.fday) as forder
    into #temp3
    from 
      (select month(fdate) as fmonth,day(fdate) as fday,fprodid from test ) t1 
      join 
      (select month(fdate) as fmonth,day(fdate) as fday,fprodid from test ) t2
      on t2.fmonth=t1.fmonth and t2.fday<=t1.fday
    where year(fdate)=2001
    group by t1.fmonth,t1.fday,t1.fprodiddeclare @strsql as varchar(8000)
    select @strsql=''
    select @strsql=@strsql +'update temp set '+
       t1.name +'=#temp3.fday,'+t2.name+'=#temp3.fprodid '+
       'from temp join #temp3 on temp.fid=#temp3.forder and #temp3.fmonth='
       +cast(t3.fmonth as varchar) +char(10)+char(13)
    from syscolumns t1,syscolumns t2,(select distinct fmonth  from #temp3) t3
    where t1.colid=t3.fmonth*2 and t2.colid=t3.fmonth*2+1 
       and t1.id=object_id('temp')
       and t2.id=object_id('temp')exec (@strsql)drop table #temp3select * from temp就可以得到结果了。
      

  3.   

    按钮姐姐再帮帮忙,
    1.能不能再解释一下colid的用法,我这边使用select * from syscolumns test时,怎么会把数据库中所有字段的信息都给列出来了.
    2.能不能再看一下往temp表中填充的过程,我这边怎么都没赋上值阿!(我是sql server 2000)
      

  4.   

    我也是用的SQL SERVER 2000,上面的程序是测试过了的。1、ColID是表中字段的顺序号。fid 的colid是1,field11的colid是2。依此类推。
    因为有十二个月的数据,所以若按一般的处理,会做一个循环写十二个对temp表的update 。因为实际上字段的顺序与月份有关,所以我用上面的办法组出一个SQL语句,一次性执行。
    每个月有两个字段:
    第n个月的第一个字段的colid=n*2
    第n个月的第二个字段的colid=n*2+1SQL语句中需要取得对应的字段名进行update ,所以我从syscolumns 表中按id及colid取出字段名。2、为什么没有赋值成功?
    A:你可以用print @strsql看这样组出来的语句有没有问题。
    B:确保temp表中已经有三十一条记录。
    C:你的表名字段名与我不一样,看是不是什么细节有错。
    3、你用select * from syscolumns test是什么意思?
    正确的写法应该是select * from syscolumns where id=object_id('temp')
    我的代码里没有查test 表的字段,你是不是这里搞错了?