请哪位大侠帮忙用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   原材料

解决方案 »

  1.   

    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
      

  2.   

    create table t(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','原材料'
    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
      

  3.   

    BOM表排序问题,用楼上的函数可以实现。
      

  4.   

    libin_ftsafe(子陌红尘:Dev-Club的潇湘)
     
     你好!
     能不能用一条select语句完成并且条件只能在字段id,parent,level,mb01,mb02,mb03中取,
     谢谢你了!!!
      

  5.   

    libin_ftsafe(子陌红尘:Dev-Club的潇湘)
    你好!
      那请帮忙写一个函数
      要求不带参数并且函数中where条件只能在字段id,parent,level中取行吗
      太感谢!很急!!!
      

  6.   

    libin_ftsate(冒牌子陌红尘:Dev-Club的潇湘 V0.1)
    你好!
    你下面的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
      

  7.   

    不能用函数,一个SQL我写不来,如果能用多个语句和临时表(或者临时字段也行),就可以写
    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      原材料
      

  8.   

    --创建用户定义函数
    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
      

  9.   

    to:正牌libin_ftsafe
    能给看一下这个问题吗?
    http://community.csdn.net/Expert/topic/5241/5241882.xml?temp=.8143122多谢了。
    对不起楼主了。请原谅