为了实现指标自动采集,我在库中建
A表:    日期  地点1   地点2  地点3。
         11.22  99       90    91想实现通过作业实现每天自动上报。
但是我从库里提取的值为
B表:    地点1   99
         地点2   90
         地点3   91该表是select出来的,不是临时表。 
现在想出来的笨办法是分地点select出B表再update到A表,即每个地点写一个update语句,地点太多,太繁琐,不知道各位有什么高招,指导一下。 
解决马上结帐。谢谢。

解决方案 »

  1.   

    lz,b表的数据格式就是这样马?
    没有日期字段马?
      

  2.   

    b表没有日期,日期是每天用insert进去了,update的时候会用现在时间和A表的日期作比对,作为条件。
      

  3.   

    由于指标的种类有8种,即重复的AB表,如果作的太复杂,作业的量也特别大。
    不知道else if能不能实现。
      

  4.   

    update 必须得 一个一个输入的...
      

  5.   

    B表是建立的表,数值为表A中ERL值。
    格式为  date         桂阳敖泉 桂阳白水 桂阳板桥 桂阳飞仙。
            2006.11.22   2         3         3        5        。
            2006.11.23   3         1         1        4        。
            。           。         。       。       。       。
            。           。         。       。       。        。     
            。           。         。       。       。目的是为了通过作业实现自动填表,每天的指标不一样。
    date可以通过作业语句每天插入当天的日期,目标值要通过
    下列语句查询
    表A是由查询出来的
    select area,erl=sum((I927+(I928+I933)/2+(I929+I934+I938)/3+(I930+I935+I939+I942)/4+(I931+I936+I940+I943+I945)/5+(I932+I937+I941+I944+I946+I947)/6+I948+(I949+I954)/2+(I950+I955+I959)/3+(I951+I956+I960+I963)/4+(I952+I957+I961+I964+I966)/5+(I953+I958+I962+I965+I967+I968)/6)/3600.0)
    from Perf_Dat4,Perf_ObjInstance where Perf_Dat4.iObjInstanceId=Perf_ObjInstance.iObjInstanceId and ((convert(char(12),stdMeasureTime,108)='16:00:00' or convert(char(12),stdMeasureTime,108)='16:30:00') and convert(char(12),stdMeasureTime,102)=convert(varchar(10),CURRENT_TIMESTAMP,102)) group by area 通过作业定时查询,今天的运行结果为:
    area            erl
    桂阳敖泉         2
    桂阳白水         3
    桂阳板桥         3
    桂阳宝           5
    桂阳方圆坪石 2
    桂阳飞仙          0
    桂阳四州山 4
    桂阳洋市 1
    宜章黄沙 4
    宜章梅田 2
    宜章岩泉0 2
    宜章岩泉1          3
    宜章岩泉2          2
    宜章杨梅山 2
    宜章瑶岗仙 1
    宜章斋公山 3
    每天的ERL值是会变化的。
    现在就是要实现通过把select语句改为UPDATE语句,写到表B中去。
      

  6.   

    查询的B表就不用了,直接更新吧
    declare @field varchar(2000),@value varchar(2000)
    set @field='' set @value=''
    select @field=@field+','+area,@value=@value+','+convert(varchar,sum((I927+(I928+I933)/2+(I929+I934+I938)/3+(I930+I935+I939+I942)/4+(I931+I936+I940+I943+I945)/5+(I932+I937+I941+I944+I946+I947)/6+I948+(I949+I954)/2+(I950+I955+I959)/3+(I951+I956+I960+I963)/4+(I952+I957+I961+I964+I966)/5+(I953+I958+I962+I965+I967+I968)/6)/3600.0))
    from Perf_Dat4,Perf_ObjInstance where Perf_Dat4.iObjInstanceId=Perf_ObjInstance.iObjInstanceId and ((convert(char(12),stdMeasureTime,108)='16:00:00' or convert(char(12),stdMeasureTime,108)='16:30:00') and convert(char(12),stdMeasureTime,102)=convert(varchar(10),CURRENT_TIMESTAMP,102)) group by area 
    exec('insert into A(日期'+@field')+' values('''+convert(varchar(10),getdate(),121)+''''+@value+')')
    --我写的是insert,如果是update只需要一个变量累计@field=@field+','+area+'='+convert(varchar,sum(...)),最后去个逗号用exec('update A set '+@field+定位条件)就好
      

  7.   

    若只是写入汇总数据的话,直接用一个动态SQL语句就可以了declare @cols varchar(4000)
    declare @sumcols varchar(4000)
    set @cols =''
    set @sumcols=''select 
      @cols=@cols +','+area,
      @sumcols=sumcols+
        ',sum(case when area='+'''+ area +'''+' then erl else 0 end) as ['+ area+']'
    from
      b
    group by 
      area
    set @cols='日期'+@cols
    set @sumcols= convert(varchar(10),getdate(),120)+@sumcols
    exec('insert into A('+@cols+') select '+@sumcols+' from b')