km表结构:kmbm、kmmc、jldw、hsdmupdate KM set zwm='资产',engl='zc' where hsdm='1'km表根本没有zwm,engl列呢,怎么update?

解决方案 »

  1.   

    简单一点说,就是先将追加km表中一些字段,并且进行替换后,再将km中的数据(只要部分列)导入kmb中相对应的列。然后进行一些判断后,根据判断的结果替换数据。不知道这样说会不会明白。
    :(((
      

  2.   

    那你这个编码规则是确定的某个值还是存在table里?
    简单点,楼主给出一些实际的数据,然后列出你想要的结果
      

  3.   

    是存在某个表里,因为时间紧张,所以根据km表进行判断其的编码规则为3223。能否用QQ,我的是88977866,谢谢。
      

  4.   

    --类似这样就行了(其他字段不知道你要怎么赋值?)
    insert kmb(kmbm,kmmc,jldw,zwm,sjmj)
    select kmbm,jmmc,jldw
    ,case hsdm 
    when '1' then '资产'
    when '2' then '负债'
    when '3' then '权益'
    when '4' then '成本'
    when '5' then '损益'
    end
    ,case when exists(select * from km where kmbm like a.kmbm+'_%') then 0 else 1 end
    from km a
      

  5.   

    感觉又是一个N叉树的深度遍历问题.级次就是kmbm的长度.根据你说的3223规则那么
    case when len(kmbm)=3  then kmjc='1'
    case when len(kmbm)=5  then kmjc='2'
    case when len(kmbm)=7  then kmjc='3'
    case when len(kmbm)=10  then kmjc='4'
    但怎么判断是不是末级,好象感觉要写函数了.
      

  6.   

    例如:
    km
       kmbh      kmmc      jldw       hsdm       .....
    (科目编码)(科目名称)(计量单位)(科目性质编码) .....
       101       现金                  1
       10101     人民币                1
       12401     库存商品   册         2kmb(空表)
        kmbm     kmmc      jldw     zwm    engl      sfmj      bgs      bmjc     ....
    (科目编码)(科目名称)(计量单位)(中文名)(英文名)(是否末级)(帐表格式)(编码级次) ....将km表数据导入kmb表后结果要求如下:
    kmb
        kmbm     kmmc      jldw     zwm    engl      sfmj      bgs      bmjc     ....
    (科目编码)(科目名称)(计量单位)(中文名)(英文名)(是否末级)(帐表格式)(编码级次) ....
       101       现金               资产    ZC         0      金额式      1
       10101     人民币             资产    ZC         1      金额式      2
       12401     库存商品   册      资产    ZC         1      数量金额式  2      ....
       .......
      

  7.   

    不行呀,提示“INSERT 语句的选择列表包含的项少于插入列表中的项。SELECT 语句中值的数目必须与 INSERT 语句中列的数目匹配。”
      

  8.   

    忘了补充说明一点,我是为了对照方便才把两张表的字段写成一致,实际上是
    km
       kmbh      kmmc      jldw       hsdm       .....
    (科目编码)(科目名称)(计量单位)(科目性质编码) .....
       101       现金                  1
       10101     人民币                1
       12401     库存商品   册         2kmb(空表)
        km     km_name      jl      zwm    engl      sfmj      bgs      bmjc     ....
    (科目编码)(科目名称)(计量单位)(中文名)(英文名)(是否末级)(帐表格式)(编码级次) ....将km表数据导入kmb表后结果要求如下:
    kmb
        km     km_name      jl      zwm    engl      sfmj      bgs      bmjc     ....
    (科目编码)(科目名称)(计量单位)(中文名)(英文名)(是否末级)(帐表格式)(编码级次) ....
       101       现金               资产    ZC         0      金额式      1
       10101     人民币             资产    ZC         1      金额式      2
       12401     库存商品   册      资产    ZC         1      数量金额式  2      ....
      

  9.   


    insert kmb(km,km_name,jl,zwm,engl,sfmj,bmjc)  --bgs无法从km表中取,所以你得单独处理,不要写在列表中
    select kmbh,kmmc,jldw
    ,case hsdm  --对应 zwm
    when '1' then '资产'
    when '2' then '负债'
    when '3' then '权益'
    when '4' then '成本'
    when '5' then '损益'
    end
    ,case hsdm --对应 engl
    when '1' then '资产'
    when '2' then '负债'
    when '3' then '权益'
    when '4' then '成本'
    when '5' then '损益'
    end
    ,case --对应 sfmj
    when exists(select * from km where kmbm like a.kmbm+'_%') then 0 
    else 1 
    end
    ,case len(kmbh) --对应 bmjc
    when 3 then 1
    when 5 then 2
    when 7 then 3
    when 10 then 4
    end
    from km a
      

  10.   

    建议楼主还是要看邹老师的思路,而细节问题应该你自己来解决.
    邹老师已经用
    ,case len(kmbh) --对应 bmjc
    when 3 then 1
    when 5 then 2
    when 7 then 3
    when 10 then 4帮你解决了级次问题.
    又用
    case --对应 sfmj
    when exists(select * from km where kmbm like a.kmbm+'_%') 
    帮你解决了是否是末级别的问题.
    你只要验证就可以了.
      

  11.   

    Rose,我写出来了,你测试下行不行1、要根据kmbm的长度来判断记录的编码级次(bmjc)并写入数据。如:编码规则(3223),kmbm=101,则bmjc=1;10101为二级,bmjc=2,则1010101001为四级。update  kmb set bmjc=(case when len(a.kmbm)=3 then 1
                                             when len(a.kmbm)=5 then 2
                                             when len(a.kmbm)=7 then 3
                                             when len(a.kmbm)=10 then 4 end)
    from kmb a2.如何根据kmbm来判断其是否属于末级(sfmj)后写入数据,如:kmbm以101开头的有两条记录,分别是101,10101,则101为非末级,10101为末级。
    update kmb set sfmj=1 
    from kmb 
    where bmjc=4
             or 
             (bmjc=3 and kmbm not in 
                 (select a.kmbm from kmb a,kmb b 
                       where a.bmjc=3 and b.bmjc=4 and a.kmbm=left(b.kmbm,7)))
             or
             (bmjc=2 and kmbm not in 
                  (select a.kmbm from kmb a,kmb b 
                       where a.bmjc=2 and b.bmjc=3 and a.kmbm=left(b.kmbm,5)))
             or
             (bmjc=1 and kmbm not in 
                  (select a.kmbm from kmb a,kmb b 
                      where a.bmjc=1 and b.bmjc=2 and a.kmbm=left(b.kmbm,3)))注意,要先做第一步后才能做第二步,因为第二步里我用了第一步中更新过的栏位
    第二步的思路如下首先bmjc=4的肯定是末级,对应的sfmj=1
    然后判断bmjc=3而且没有其他前7位与它相同的,则sfmj=1
    然后判断bmjc=2而且没有其他前5位与它相同的,则sfmj=1
    然后判断bmjc=2而且没有其他前3位与它相同的,则sfmj=1也就是采用从后往前推的方法,昨晚一开始我一直试图从前往后推,所以一下子卡住了,呵呵
      

  12.   

    好像还了个条件可以去掉update kmb set sfmj=1 
    from kmb 
    where bmjc=4
             or 
             (bmjc=3 and kmbm not in 
                 (select a.kmbm from kmb a,kmb b 
                       where  b.bmjc=4 and a.kmbm=left(b.kmbm,7)))
             or
             (bmjc=2 and kmbm not in 
                  (select a.kmbm from kmb a,kmb b 
                       where  b.bmjc=3 and a.kmbm=left(b.kmbm,5)))
             or
             (bmjc=1 and kmbm not in 
                  (select a.kmbm from kmb a,kmb b 
                      where b.bmjc=2 and a.kmbm=left(b.kmbm,3)))
      

  13.   

    本来想回答,但看到zjcxc(邹建)大哥也在,呵呵,我还是走吧
      

  14.   

    只可惜bmjc是4上固定的.要是动态的.该怎么办,我老想着树,大概看树看多了.
      

  15.   

    因为rose昨晚跟我说bmjc和编码规则都是固定的,我才这么写,逻辑上理解起来简单点。如果是动态的确实有点麻烦,我一下子也没有好办法不过如果还是采用我这个逻辑应该也是可以的,用动态sql,根据编码规则来生成同样的sql语句应该是可行的。
      

  16.   

    一个insert处理不好么? 干嘛非得写那么多呢? 对象名无效是你自己写错了对象名嘛