以下疑问:
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、你在填充第一个月的数据前,表中有无记录?有记录是不是就会有三十一条?
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.临时表中的31条记录各有一个字段来表示该条记录的记录号.
2.差不多,为ffield??中只填充具体的日子即可
fid ffield11 ffield12 ffield21 ffield22 ....
1 1 abc 5 dbf
2 8 ddd 6 ere
3.填充第二个月时,不是按fid的,只不过在从数据源查找时用了一个order by,在这边填充时只要按顺序填入即可,没必要将具体的日期和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就可以得到结果了。
1.能不能再解释一下colid的用法,我这边使用select * from syscolumns test时,怎么会把数据库中所有字段的信息都给列出来了.
2.能不能再看一下往temp表中填充的过程,我这边怎么都没赋上值阿!(我是sql server 2000)
因为有十二个月的数据,所以若按一般的处理,会做一个循环写十二个对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 表的字段,你是不是这里搞错了?