请哪位大侠帮忙用sql语句从图1转换成图2,谢谢!好急!!!!!图1
id parent level mb01 mb02 mb03 mb04 mb05
-----------------------------------------------------
1 -1 1 T0001 1 T0002 PCS 原材料
2 -1 1 T0001 2 T0003 PCS 原材料
3 -1 1 T0001 3 T0010 PCS 半成品
4 -1 1 T0001 4 T0004 PCS 原材料
5 3 2 T0010 1 T0007 PCS 原材料
6 3 2 T0010 2 T0008 PCS 原材料
7 3 2 T0010 3 T0009 PCS 原材料
8 3 2 T0010 4 T0005 PCS 半成品
9 3 2 T0010 5 T0006 PCS 原材料
10 8 3 T0005 1 T0002 PCS 原材料
11 8 3 T0005 2 T0004 PCS 原材料
图2
id parent level mb01 mb02 mb03 mb04 mb05
----------------------------------------------------
1 -1 1 T0001 1 T0002 PCS 原材料
2 -1 1 T0001 2 T0003 PCS 原材料
3 -1 1 T0001 3 T0010 PCS 半成品
5 3 2 T0010 1 T0007 PCS 原材料
6 3 2 T0010 2 T0008 PCS 原材料
7 3 2 T0010 3 T0009 PCS 原材料
8 3 2 T0010 4 T0005 PCS 半成品
10 8 3 T0005 1 T0002 PCS 原材料
11 8 3 T0005 2 T0004 PCS 原材料
9 3 2 T0010 5 T0006 PCS 原材料
4 -1 1 T0001 4 T0004 PCS 原材料
id parent level mb01 mb02 mb03 mb04 mb05
-----------------------------------------------------
1 -1 1 T0001 1 T0002 PCS 原材料
2 -1 1 T0001 2 T0003 PCS 原材料
3 -1 1 T0001 3 T0010 PCS 半成品
4 -1 1 T0001 4 T0004 PCS 原材料
5 3 2 T0010 1 T0007 PCS 原材料
6 3 2 T0010 2 T0008 PCS 原材料
7 3 2 T0010 3 T0009 PCS 原材料
8 3 2 T0010 4 T0005 PCS 半成品
9 3 2 T0010 5 T0006 PCS 原材料
10 8 3 T0005 1 T0002 PCS 原材料
11 8 3 T0005 2 T0004 PCS 原材料
图2
id parent level mb01 mb02 mb03 mb04 mb05
----------------------------------------------------
1 -1 1 T0001 1 T0002 PCS 原材料
2 -1 1 T0001 2 T0003 PCS 原材料
3 -1 1 T0001 3 T0010 PCS 半成品
5 3 2 T0010 1 T0007 PCS 原材料
6 3 2 T0010 2 T0008 PCS 原材料
7 3 2 T0010 3 T0009 PCS 原材料
8 3 2 T0010 4 T0005 PCS 半成品
10 8 3 T0005 1 T0002 PCS 原材料
11 8 3 T0005 2 T0004 PCS 原材料
9 3 2 T0010 5 T0006 PCS 原材料
4 -1 1 T0001 4 T0004 PCS 原材料
order by case when exists (
select 1 from 图1
where mb01=a.mb01
and mb02<a.mb02
and mb05='半成品'
) then 1 else 0 end,id
insert into t select 1 ,-1,1,'T0001',1,'T0002','PCS','原材料'
insert into t select 2 ,-1,1,'T0001',2,'T0003','PCS','原材料'
insert into t select 3 ,-1,1,'T0001',3,'T0010','PCS','半成品'
insert into t select 4 ,-1,1,'T0001',4,'T0004','PCS','原材料'
insert into t select 5 , 3,2,'T0010',1,'T0007','PCS','原材料'
insert into t select 6 , 3,2,'T0010',2,'T0008','PCS','原材料'
insert into t select 7 , 3,2,'T0010',3,'T0009','PCS','原材料'
insert into t select 8 , 3,2,'T0010',4,'T0005','PCS','半成品'
insert into t select 9 , 3,2,'T0010',5,'T0006','PCS','原材料'
insert into t select 10, 8,3,'T0005',1,'T0002','PCS','原材料'
insert into t select 11, 8,3,'T0005',2,'T0004','PCS','原材料'
go
--创建用户定义函数
create function f_getNum(@id int)
returns varchar(4000)
as
begin
declare @ret varchar(4000),@pid int
set @ret = right('0000'+rtrim(@id),4)
while exists(select 1 from t where id=@id and parent!=-1)
begin
select @pid=parent from t where id=@id and parent!=-1
set @id = @pid
set @ret = right('0000'+rtrim(@id),4)+@ret
end
return @ret
end
goselect * from t order by dbo.f_getNum(id)
go
/*
id parent level mb01 mb02 mb03 mb04 mb05
----------------------------------------------------
1 -1 1 T0001 1 T0002 PCS 原材料
2 -1 1 T0001 2 T0003 PCS 原材料
3 -1 1 T0001 3 T0010 PCS 半成品
5 3 2 T0010 1 T0007 PCS 原材料
6 3 2 T0010 2 T0008 PCS 原材料
7 3 2 T0010 3 T0009 PCS 原材料
8 3 2 T0010 4 T0005 PCS 半成品
10 8 3 T0005 1 T0002 PCS 原材料
11 8 3 T0005 2 T0004 PCS 原材料
9 3 2 T0010 5 T0006 PCS 原材料
4 -1 1 T0001 4 T0004 PCS 原材料
*/
drop function f_getNum
drop table t
go
你好!
能不能用一条select语句完成并且条件只能在字段id,parent,level,mb01,mb02,mb03中取,
谢谢你了!!!
你好!
那请帮忙写一个函数
要求不带参数并且函数中where条件只能在字段id,parent,level中取行吗
太感谢!很急!!!
你好!
你下面的select取值结果有点问题,能不能帮改进一下
select * from 图1 a
order by case when exists (
select 1 from 图1
where mb01=a.mb01
and mb02<a.mb02
and mb05='半成品'
) then 1 else 0 end,id
declare @t table(id int,parent int,level int,mb01 varchar(8),mb02 int,mb03 varchar(8),mb04 varchar(8),mb05 varchar(8))
insert into @t select 1 ,-1,1,'T0001',1,'T0002','PCS','原材料'
insert into @t select 2 ,-1,1,'T0001',2,'T0003','PCS','原材料'
insert into @t select 3 ,-1,1,'T0001',3,'T0010','PCS','半成品'
insert into @t select 4 ,-1,1,'T0001',4,'T0004','PCS','原材料'
insert into @t select 5 , 3,2,'T0010',1,'T0007','PCS','原材料'
insert into @t select 6 , 3,2,'T0010',2,'T0008','PCS','原材料'
insert into @t select 7 , 3,2,'T0010',3,'T0009','PCS','原材料'
insert into @t select 8 , 3,2,'T0010',4,'T0005','PCS','半成品'
insert into @t select 9 , 3,2,'T0010',5,'T0006','PCS','原材料'
insert into @t select 10, 8,3,'T0005',1,'T0002','PCS','原材料'
insert into @t select 11, 8,3,'T0005',2,'T0004','PCS','原材料'declare @temp table(id int,treecode varchar(1000))
declare @i int,@pid int,@max int
set @max=(select max(level) from @t)
set @i=1
while @i<=@max
begin
insert into @temp
select id,isnull((select treecode from @temp where id=a.parent),'')+
right('0000'+convert(varchar,(select count(*) from @t
where parent=a.parent and id<=a.id)),4) from @t a where level=@i
set @i=@i+1
end
select a.* from @t a inner join @temp b on a.id=b.id order by treecodeid parent level mb01 mb02 mb03 mb04 mb05
----------- ----------- ----------- -------- ----------- -------- -------- --------
1 -1 1 T0001 1 T0002 PCS 原材料
2 -1 1 T0001 2 T0003 PCS 原材料
3 -1 1 T0001 3 T0010 PCS 半成品
5 3 2 T0010 1 T0007 PCS 原材料
6 3 2 T0010 2 T0008 PCS 原材料
7 3 2 T0010 3 T0009 PCS 原材料
8 3 2 T0010 4 T0005 PCS 半成品
10 8 3 T0005 1 T0002 PCS 原材料
11 8 3 T0005 2 T0004 PCS 原材料
9 3 2 T0010 5 T0006 PCS 原材料
4 -1 1 T0001 4 T0004 PCS 原材料
create function f_getNum()
returns @t table (id int,parent int,level int,mb01 varchar(8),mb02 int,mb03 varchar(8),mb04 varchar(8),mb05 varchar(8))
as
begin
insert into @t select 1 ,-1,1,'T0001',1,'T0002','PCS','原材料'
insert into @t select 2 ,-1,1,'T0001',2,'T0003','PCS','原材料'
insert into @t select 3 ,-1,1,'T0001',3,'T0010','PCS','半成品'
insert into @t select 4 ,-1,1,'T0001',4,'T0004','PCS','原材料'
insert into @t select 5 , 3,2,'T0010',1,'T0007','PCS','原材料'
insert into @t select 6 , 3,2,'T0010',2,'T0008','PCS','原材料'
insert into @t select 7 , 3,2,'T0010',3,'T0009','PCS','原材料'
insert into @t select 8 , 3,2,'T0010',4,'T0005','PCS','半成品'
insert into @t select 9 , 3,2,'T0010',5,'T0006','PCS','原材料'
insert into @t select 10, 8,3,'T0005',1,'T0002','PCS','原材料'
insert into @t select 11, 8,3,'T0005',2,'T0004','PCS','原材料'
declare @t1 table(id int,parent int,level int,mb01 varchar(8),mb02 int,
mb03 varchar(8),mb04 varchar(8),mb05 varchar(8),
ord varchar(40))
insert into @t1
select *,case parent when -1 then '' else right('0000'+rtrim(parent),4) end+right('0000'+rtrim(id),4)
from @t
if @@rowcount<>0
begin
update b
set
ord=right('0000'+rtrim(a.parent),4)+b.ord
from
@t a,
@t1 b
where
a.id=left(ord,4)
and
a.parent!=-1
end
delete @t
insert into @t
select id ,parent ,level ,mb01,mb02 ,mb03 ,mb04 ,mb05 from @t1 order by ord return
end
goselect * from dbo.f_getNum()
go
/*
id parent level mb01 mb02 mb03 mb04 mb05
----------------------------------------------------
1 -1 1 T0001 1 T0002 PCS 原材料
2 -1 1 T0001 2 T0003 PCS 原材料
3 -1 1 T0001 3 T0010 PCS 半成品
5 3 2 T0010 1 T0007 PCS 原材料
6 3 2 T0010 2 T0008 PCS 原材料
7 3 2 T0010 3 T0009 PCS 原材料
8 3 2 T0010 4 T0005 PCS 半成品
10 8 3 T0005 1 T0002 PCS 原材料
11 8 3 T0005 2 T0004 PCS 原材料
9 3 2 T0010 5 T0006 PCS 原材料
4 -1 1 T0001 4 T0004 PCS 原材料
*/
drop function f_getNum
go
能给看一下这个问题吗?
http://community.csdn.net/Expert/topic/5241/5241882.xml?temp=.8143122多谢了。
对不起楼主了。请原谅