想为指定字段的NULL值数据指定一个值,可以用Isnull(字段名, 值)函数。可以省不少事。

解决方案 »

  1.   

    ccat(阿猫),但不知道它是否为空哪
    llww0208(土狼),我本来就是从几个表中提出,怎么存到临时表是再提出,愚钝,看不出什么意义,或者,能讲讲你思路吗?
      

  2.   

    你直接用SQLserver自身带的查询优化器不是挺好吗,
    不知你用过没有,很好使况且我们也不知道你的那些表数据量如何
      

  3.   

    建议使用
    COALESCE ( expression [ ,...n ] ) 
    精简代码。
    具体清查帮助信息。
      

  4.   

    lzp_lrp(lzp) :
    请问查询优化器在哪,我搞不清哪,我这条SQL语句是要嵌入到程序里面的。谢谢 GRANDTREE(武树伟) (  ),我查了一下COALESCE,我想我前面的应该可以改成:
    insert kucun(dh,th,mc,qcshl,qcje,rkshl,rkje,llshl,llje,ykshl,ykje,kcrq)
    select 
    COALESCE(kc.dh,rk.dh,ll.dh,yk.dh) dh,
    COALESCE(kc.th,rk.th,ll.th,yk.th) th,
    COALESCE(kc.mc,rk.mc,ll.mc,yk.mc) mc,
    sum...
    明天试试
    不知下面的还可以优化不?
      

  5.   

    group by kc.dh,rk.dh,ll.dh,yk.dh,kc.th,rk.th,ll.th,yk.th,kc.mc,rk.mc,ll.mc,yk.mc order by dh,th
    改成 :group by dh+th
      

  6.   

    group by kc.dh,rk.dh,ll.dh,yk.dh,kc.th,rk.th,ll.th,yk.th,kc.mc,rk.mc,ll.mc,yk.mc order by dh,th
    改成 :group by dh+th+mc
    不会重单号
      

  7.   

    j9988(j9988) :
       不能用这种写法的,在使用GROUP BY语句时,在SELECT 子句的字段列表中,除了SUM(),其他所出现的字段一定要在GROUP BY子句中有定义才行。现在经过GRANDTREE(武树伟)的提醒,可以简化为:
    insert kucun(dh,th,mc,qcshl,qcje,rkshl,rkje,llshl,llje,ykshl,ykje,kcrq)
    select 
    COALESCE(kc.dh,rk.dh,ll.dh,yk.dh) dh,
    COALESCE(kc.th,rk.th,ll.th,yk.th) th,
    COALESCE(kc.mc,rk.mc,ll.mc,yk.mc) mc,
    sum(coalesce(kc.qcshl+kc.rkshl-kc.llshl+kc.ykshl,0)) as qcshl,
    sum(coalesce(kc.qcje+kc.rkje-kc.llje+kc.ykje,0)) as qcje,
    sum(coalesce(rk.shl,0)) as rkshl,
    sum(coalesce(rk.shl*rk.dj,0)) as rkje,
    sum(coalesce(ll.shl,0)) as llshl,
    sum(coalesce(ll.shl*ll.dj,0)) as llje,
    sum(coalesce(yk.shl,0)) as ykshl,
    sum(coalesce(yk.shl*yk.dj,0)) as ykje,
    6 as kcrq
    from kucun kc full join ruku rk on kc.dh=rk.dh and kc.th=rk.th 
    full join lingliao ll on rk.dh=ll.dh and rk.th=ll.th 
    full join yingkui yk on rk.dh=yk.dh and rk.th=yk.th 
    where kcrq=5 or month(rk.djrq)=6 or month(ll.djrq)=6 or month(yk.djrq)=6
    group by kc.dh,rk.dh,ll.dh,yk.dh,kc.th,rk.th,ll.th,yk.th,kc.mc,rk.mc,ll.mc,yk.mc order by dh,th 不知还应怎样优化,而且,还是有同dh、th的数据不是同一条记录,不知如何解决
      

  8.   

    用full join 的结果对吗??表示怀疑!!
    建议用临时表,一个表一个表的网一个临时表加数据。
      

  9.   

    insert kucun(dh,th,mc,qcshl,qcje,rkshl,rkje,llshl,llje,ykshl,ykje,kcrq)
    select dh,th,min(mc),sum(qcshl+rkshl-llshl+ykshl),sum(qcje+rkje-llje+ykje),rkshl=0,rkje=0,llshl=0,llje=0,ykshl=0,ykje=0,6 as kcrq
    from kucun 
    where kcrq=5 
    group by dh,thselect dh,th,min(mc) as mc,rkshl=sum(rk.shl),rkje=sum(rk.shl*rk.dj)
    into #TemRk
    from ruku rk
    where month(rk.djrq)=6 
    update kucun
    set 
    rkshl=rk.shl,rkje=rk.shl*rk.dj
    from kucun a,#TemRk rk
    where a.dh=rk.dh and a.th=rk.th insert kucun(dh,th,mc,qcshl,qcje,rkshl,rkje,llshl,llje,ykshl,ykje,kcrq)
    select dh,th,mc,0,0,rkshl,rkje,llshl=0,llje=0,ykshl=0,ykje=0,6 as kcrq
    from #TemRk rk
    where not exists (
    select 1 from kucun a
    where a.dh=rk.dh and a.th=rk.th 
    )........
    (其他的你自己写,看得好累!)
    group by dh,thdh生产单号,th产品图号,mc产品名称,qcshl期初数量,qcje期初金额,rkshl入库数量,rkje入库金额,llshl领料数量,llje领料金额,ykshl盈亏数量,ykje盈亏金额,汇总月份kcrq
      

  10.   

    Updated:insert kucun(dh,th,mc,qcshl,qcje,rkshl,rkje,llshl,llje,ykshl,ykje,kcrq)
    select dh,th,min(mc),sum(qcshl+rkshl-llshl+ykshl),sum(qcje+rkje-llje+ykje),rkshl=0,rkje=0,llshl=0,llje=0,ykshl=0,ykje=0,6 as kcrq
    from kucun 
    where kcrq=5 
    group by dh,thselect dh,th,min(mc) as mc,rkshl=sum(rk.shl),rkje=sum(rk.shl*rk.dj)
    into #TemRk
    from ruku rk
    where month(rk.djrq)=6 
    update kucun
    set 
    rkshl=rk.shl,rkje=rk.shl*rk.dj
    from kucun a,#TemRk rk
    where a.dh=rk.dh and a.th=rk.th insert kucun(dh,th,mc,qcshl,qcje,rkshl,rkje,llshl,llje,ykshl,ykje,kcrq)
    select dh,th,mc,0,0,rkshl,rkje,llshl=0,llje=0,ykshl=0,ykje=0,6 as kcrq
    from #TemRk rk
    where not exists (
    select 1 from kucun a
    where a.dh=rk.dh and a.th=rk.th 
    )drop table #TemRk........
    (其他的你自己写,看得好累!)
      

  11.   

    这是我用临时表写的,思路就是先把四个符合条件的记录加到一临时表中,
    再把分组汇总的临时表加到库存表中
    不知效率如何,好象太复杂了:create table temp1(dh char(5),th char(20),mc char(12),qcshl int,qcje numeric(8,2),rkshl int,rkje numeric(8,2),llshl int,llje numeric(8,2),ykshl int,ykje numeric(8,2),kcrq char(6))
    --建立临时表temp1
    insert temp1 (dh,th,mc,qcshl,qcje)
    select dh,th,mc,qcshl+rkshl-llshl+ykshl as qcshl,
    qcje+rkje-llje+ykje as qcje from kucun where kcrq='200206'
    --在TEMP1中插入上月库存余额至本月期初
    insert temp1 (dh,th,mc,rkshl,rkje)
    select dh,th,mc,shl as rkshl,shl*dj as rkje from ruku where month(djrq)=7
    --在TEMP1中插入本月入库数
    insert temp1 (dh,th,mc,llshl,llje)
    select dh,th,mc,shl as llshl,shl*dj as llje from lingliao where month(djrq)=7
    --在TEMP1中插入本月领料数
    insert temp1 (dh,th,mc,ykshl,ykje)
    select dh,th,mc,shl as ykshl,shl*dj as ykje from yingkui where month(djrq)=7
    --在TEMP1中插入本月盈亏数
    insert kucun(dh,th,mc,qcshl,qcje,rkshl,rkje,llshl,llje,ykshl,ykje,kcrq)
    select dh,th,mc,sum(coalesce(qcshl,0)),sum(coalesce(qcje,0)),sum(coalesce(rkshl,0)),
    sum(coalesce(rkje,0)),sum(coalesce(llshl,0)),sum(coalesce(llje,0)),sum(coalesce(ykshl,0)),
    sum(coalesce(ykje,0)),'200207' from temp1 
    group by dh,th,mc order by dh,th,mc
    --把TEMP1分组汇总插入库存表
    drop table temp1
    扬兄的意思是不是先把上月库存累到本月,再把本月入库相同的更新入库,不同的追加入库记录...用哪一种效率高些呢?
      

  12.   

    其实现在这种思路就是用VF的APPE FROM的方法,后来学了SQL,整个儿就老想着用一条语句去JOIN ON :)其实数据量应该不算大,估计每个表符合条件的记录不会上万条
    我在想,相对而言,是不是,这几个表中相同图号的比较多的话,就用你的方法好些,因为有很多记录就可以是update实现的,反之则是我的,
    还有,这仅是万条的数量级,两者效率会有什么明显差别吗
      

  13.   

    update的速度不如INSERT!
    我的建了几个临时表。综合来说你的效率高些。
    你的可以改进的是建临时表时用NOT NULL DEFAULT(0),汇总时不必用coalesce函数,数据量大的话可以提高效率。
      

  14.   

    呵,犯了概念性错误,一直以为update的速度快于INSERT