表1:行号   表2取值或公式    项目h1      1          原料采购
h2      1        生产领用
h3      0        h1-h2
h4      1          国内销售
h5      1       国外销售
h6      0               h4+h5表2:项目           值原料采购        7
生产领用       4
国内销售       11
国外销售       5
所得结果:行号         值
h1           7
h2           4
h3           3
h4           11
h5           5
h6           16

解决方案 »

  1.   

    CREATE TABLE t1 (a VARCHAR(10),b bit,c VARCHAR(20))
    INSERT t1 SELECT 'h1'     , 1,          '原料采购'
    UNION ALL SELECT 'h2'    ,  1,        '生产领用'
    UNION ALL SELECT 'h3'   ,   0 ,       'h1-h2'
    UNION ALL SELECT 'h4'  ,    1,          '国内销售'
    UNION ALL SELECT 'h5' ,     1,       '国外销售'
    UNION ALL SELECT 'h6',      0,               'h4+h5'
    CREATE TABLE t2 (c VARCHAR(20),num INT)
    INSERT t2 SELECT '原料采购' ,       7
    UNION ALL SELECT '生产领用',       4
    UNION ALL SELECT '国内销售' ,      11
    UNION ALL SELECT '国外销售'  ,     5
    SELECT base.a,base.b,
    CASE WHEN CHARINDEX('-',base.c)>0 THEN x.num-y.num
    WHEN CHARINDEX('+',base.c)>0 THEN x.num+y.num
    ELSE x.num END  
    FROM 
    (SELECT a.a a ,a.b b,REPLACE(REPLACE(a.c,b.a,b.c),c.a,c.c) c
    FROM t1 a
    INNER JOIN t1 b
    ON CHARINDEX(' ' + b.a, ' ' + a.c)>0
    INNER JOIN t1 c
    ON CHARINDEX('+' + c.a,a.c)>0 OR CHARINDEX('-' + c.a,a.c)>0
    UNION ALL 
    SELECT a,b,c FROM t1 WHERE c NOT LIKE 'h[1-9]%'
    ) base
    LEFT JOIN t2 x
    ON CHARINDEX(' '+x.c,' '+base.c)>0
    LEFT JOIN t2 y
    ON CHARINDEX('+'+y.c,base.c)>0 OR CHARINDEX('-'+y.c,base.c)>0
    ORDER BY base.a
    DROP TABLE t1
    DROP TABLE t2/*result
    a b num
    h1 1 7
    h2 1 4
    h3 0 3
    h4 1 11
    h5 1 5
    h6 0 16
    */
      

  2.   

    这种SQL我喜欢写,不过确实,不适合在数据库端得出这样的结果.除非有特别要求.
      

  3.   

    主要是很难做到通用用sql做文法分析也太难为sql了