表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语句来实现,不要用游标来写。
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语句来实现,不要用游标来写。
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
*/
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
*/
表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 材料成本差异
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 材料成本差异
*/