表t1的数据如下:
id    f1      f2
1    101       0
2    10101     1
3    10102     1
4    10103     1
5    102       0
6    10201     0
7    1020101   1
8    131       1 说明:t1.f2为明细字段,t1.f2=1表示为明细记录,比如t1.f1=101有下一级,所以t1.id=1时的t1.f2=0,“101”的下一级有:10101和10102;t1.f1=131时,由于没有下一级,所以t1.f2=1是明细记录;以此类推。
表t2的数据如下:
id      f1      f2        f3
1      10101    10        30
2      10102    30
3      10201              
4      1210101  40        50
5      131                60
我想把t2的数据实现:
id      f1      f2        f3
1      101      40        30
3      102      40        50
5      131                60  如何用sql语句来实现,不要用游标来写。

解决方案 »

  1.   

    declare @t1 table(id int,f1 varchar(10),f2 int)
    insert into @t1 select 1,rtrim('101    '),0
    insert into @t1 select 2,rtrim('10101  '),1
    insert into @t1 select 3,rtrim('10102  '),1
    insert into @t1 select 4,rtrim('10103  '),1
    insert into @t1 select 5,rtrim('102    '),0
    insert into @t1 select 6,rtrim('10201  '),0
    insert into @t1 select 7,rtrim('1020101'),1
    insert into @t1 select 8,rtrim('131    '),1 declare @t2 table(id int,f1 varchar(10),f2 int,f3 int)
    insert into @t2 select 1,rtrim('10101  '),10  ,30
    insert into @t2 select 2,rtrim('10102  '),30  ,null
    insert into @t2 select 3,rtrim('10201  '),null,null
    insert into @t2 select 4,rtrim('1020101'),40  ,50
    insert into @t2 select 5,rtrim('131    '),null,60
    select 
        min(b.id)    as id ,
        a.f1,
        sum(b.f2)    as f2,
        sum(b.f3)    as f3
    from 
        (select distinct left(f1,3) as f1 from @t1 where f2=1) a,@t2 b
    where
        a.f1=left(b.f1,3)
    group by
        a.f1/*
    id          f1     f2          f3          
    ----------- ------ ----------- ----------- 
    1           101    40          30
    3           102    40          50
    5           131    NULL        60
    */
      

  2.   

    declare @t1 table(id int,f1 varchar(10),f2 int)
    insert into @t1 select 1,rtrim('101    '),0
    insert into @t1 select 2,rtrim('10101  '),1
    insert into @t1 select 3,rtrim('10102  '),1
    insert into @t1 select 4,rtrim('10103  '),1
    insert into @t1 select 5,rtrim('102    '),0
    insert into @t1 select 6,rtrim('10201  '),0
    insert into @t1 select 7,rtrim('1020101'),1
    insert into @t1 select 8,rtrim('131    '),1 declare @t2 table(id int,f1 varchar(10),f2 int,f3 int)
    insert into @t2 select 1,rtrim('10101  '),10  ,30
    insert into @t2 select 2,rtrim('10102  '),30  ,null
    insert into @t2 select 3,rtrim('10201  '),null,null
    insert into @t2 select 4,rtrim('1020101'),40  ,50
    insert into @t2 select 5,rtrim('131    '),null,60
    select 
        min(id)    as id ,
        left(f1,3) as f1,
        sum(f2)    as f2,
        sum(f3)    as f3
    from 
        @t2
    group by
        left(f1,3)/*
    id          f1     f2          f3          
    ----------- ------ ----------- ----------- 
    1           101    40          30
    3           102    40          50
    5           131    NULL        60
    */
      

  3.   

    to libin_ftsafe(子陌红尘):
    表t1的数据如下:
    id    f1      f2      f3
    1    101       0     现金
    2    10101     1     人民币
    3    10102     1     港币
    4    10103     1     美金
    5    102       0     银行存款
    6    10201     0     中国银行
    7    1020101   1     中国银行A支行
    8    131       1     材料成本差异 说明:t1.f2为明细字段,t1.f2=1表示为明细记录,比如t1.f1=101有下一级,所以t1.id=1时的t1.f2=0,“101”的下一级有:10101和10102;t1.f1=131时,由于没有下一级,所以t1.f2=1是明细记录;以此类推。
    表t2的数据如下:
    id      f1      f2        f3
    1      10101    10        30
    2      10102    30
    3      10201              
    4      1210101  40        50
    5      131                60
    我想把t2的数据实现:
    id      f1      f2        f3       f4  
    1      101      40        30       现金
    3      102      40        50       银行存款
    5      131                60       材料成本差异
      

  4.   

    declare @t1 table(id int,f1 varchar(10),f2 int,f3 varchar(20))
    insert into @t1 select 1,rtrim('101    '),0,rtrim('现金    ')     
    insert into @t1 select 2,rtrim('10101  '),1,rtrim('人民币  ')     
    insert into @t1 select 3,rtrim('10102  '),1,rtrim('港币    ')     
    insert into @t1 select 4,rtrim('10103  '),1,rtrim('美金    ')     
    insert into @t1 select 5,rtrim('102    '),0,rtrim('银行存款')     
    insert into @t1 select 6,rtrim('10201  '),0,rtrim('中国银行')     
    insert into @t1 select 7,rtrim('1020101'),1,rtrim('中国银行A支行')
    insert into @t1 select 8,rtrim('131    '),1,rtrim('材料成本差异')  declare @t2 table(id int,f1 varchar(10),f2 int,f3 int)
    insert into @t2 select 1,rtrim('10101  '),10  ,30
    insert into @t2 select 2,rtrim('10102  '),30  ,null
    insert into @t2 select 3,rtrim('10201  '),null,null
    insert into @t2 select 4,rtrim('1020101'),40  ,50
    insert into @t2 select 5,rtrim('131    '),null,60
    select 
        min(b.id)    as id ,
        a.f1,
        sum(b.f2)    as f2,
        sum(b.f3)    as f3,
        a.f3         as f4
    from 
        @t1 a,@t2 b
    where
        a.f1=left(b.f1,3)
    group by
        a.f1,a.f3
    order by
        id/*
    id          f1         f2          f3          f4                   
    ----------- ---------- ----------- ----------- -------------------- 
    1           101        40          30          现金
    3           102        40          50          银行存款
    5           131        NULL        60          材料成本差异
    */