类似问题:
http://community.csdn.net/Expert/topic/3345/3345635.xml?temp=7.154483E-02

解决方案 »

  1.   

    select 
    a.name,
    sum(isnull(b.[time],0)) as Sum_Time
    from tb1 a,tb2 b
    where a.projectID=b.projectID
    group by a.name
      

  2.   


    --写个处理函数
    create function f_id(
    )returns @re table(ProjectID int,level int,sid varchar(8000))
    as
    begin
    declare @l int
    set @l=0
    insert @re select ProjectID,@l,right(10000+ProjectID,4)
    from 表1
    where ParentID=-1
    while @@rowcount>0
    begin
    set @l=@l+1
    insert @re select a.ProjectID,@l,b.sid+'-'+right(10000+a.ProjectID,4)
    from 表1 a,@re b
    where a.ParentID=b.ProjectID and b.level=@l-1
    end
    return
    end
    go--调用函数实现查询
    select a.Name,Sum_Time=sum(b.[Time])
    from 表1 a,表2 b,f_id() c
    where a.ProjcetID=b.ProjcetID 
    and b.ProjcetID=c.ProjcetID
    group by a.Name
    order by max(c.sid)
      

  3.   

    to zjcxc(邹建) :能否给一些解释?
      

  4.   

    to zjcxc(邹建) : 
    我执行了一下,不太对!只能得到一个顶级project的所有次级project的总时间,我还要所有顶级project的求和时间却没有能否把你的function解释一下?谢谢您麻烦您
      

  5.   

    楼主给的数据是不是错了?
    bbb  就该是9.00吧?
      

  6.   

    to yjdn(无尽天空): bbb  是9.00,我写错了
      

  7.   

    --调用函数实现查询(调用写错了一点,没有注意到你是要求分级汇总)select a.Name,Sum_Time=sum(b.[Time])
    from 表1 a,表2 b,(
    select a_ProjectID=a.ProjectID,b_ProjectID=b.ProjectID,a.sid
    from f_id() a,f_id() b
    where b.sid+'-' like a.sid+'-%') c
    where a.ProjectID=c.a_ProjectID 
    and b.ProjectID=c.b_ProjectID
    group by a.Name
    order by max(c.sid)
      

  8.   

    --测试--测试数据
    create table 表1(ProjectID int,ParentID int,Name varchar(10))
    insert 表1 select 1,-1,'aaa'
    union  all select 2,-1,'bbb'
    union  all select 3,1,'aaa1'
    union  all select 4,1,'aaa2'
    union  all select 5,2,'bbb1'
    union  all select 6,2,'bbb2'
    union  all select 7,2,'bbb3'create table 表2(ID int,ProjectID int,Time decimal(10,2))
    insert 表2 select 1,3,2.00
    union  all select 2,3,4.50
    union  all select 3,4,1.00
    union  all select 4,3,7.00
    union  all select 5,5,1.00
    union  all select 6,5,2.00
    union  all select 7,6,2.00
    union  all select 8,7,1.00
    union  all select 9,7,3.00
    go--写个处理函数
    create function f_id(
    )returns @re table(ProjectID int,level int,sid varchar(8000))
    as
    begin
    declare @l int
    set @l=0
    insert @re select ProjectID,@l,right(10000+ProjectID,4)
    from 表1
    where ParentID=-1
    while @@rowcount>0
    begin
    set @l=@l+1
    insert @re select a.ProjectID,@l,b.sid+'-'+right(10000+a.ProjectID,4)
    from 表1 a,@re b
    where a.ParentID=b.ProjectID and b.level=@l-1
    end
    return
    end
    go--调用函数实现查询
    select a.Name,Sum_Time=sum(b.[Time])
    from 表1 a,表2 b,(
    select a_ProjectID=a.ProjectID,b_ProjectID=b.ProjectID,a.sid
    from f_id() a,f_id() b
    where b.sid+'-' like a.sid+'-%') c
    where a.ProjectID=c.a_ProjectID 
    and b.ProjectID=c.b_ProjectID
    group by a.Name
    order by max(c.sid)
    go--删除测试
    drop table 表1,表2
    drop function f_id/*--测试结果aaa        14.50
    aaa1       13.50
    aaa2       1.00
    bbb        9.00
    bbb1       3.00
    bbb2       2.00
    bbb3       4.00(所影响的行数为 7 行)
    --*/
      

  9.   

    一个垃圾代码:虽然可以实现,但太长了
    select d.Name ,sum_time from 
    (select a.ParentID as tt,sum(b.tt) as sum_time from table1 a,(select ProjectID,sum(Time)as tt from table2 group by ProjectID) b 
    where b.ProjectID=a.ProjectID group by a.ParentID
    union all
    select ProjectID as tt,sum(Time)as sum_time  from table2 group by ProjectID) c,table1 d 
    where c.tt=d.ProjectID order by Name
      

  10.   

    结果:
    Name Sum_Time
    aaa 14.50
    aaa1 13.50
    aaa2 1.00
    bbb 7.00
    bbb1 3.00
    bbb2 2.00
    bbb3 4.00
      

  11.   

    To yjdn(无尽天空) : 
    谢谢您,看懂了你的SQL
    Perfect!!
    但是,
    还想问你一下:如果我的顶级project和次级project的首字母是不一样,
    我排序的时候还是希望:顶级的项目排在最前,次级的项目排在后面,然后再排起他的顶级项目以及他的次级的项目。这个order by怎么写呢?
      

  12.   

    希望yjdn(无尽天空) 在线, 在线等待中!
      

  13.   

    原先的例子举的不好projectID是无序的table1
    ProjectID ParentID  Name
    1 -1 aaa
    11 -1 bbb
    3 1 cc-aaa
    10 1 zz-aaa
    12 11 dd-bbb
    9 11 ff-bbb
    7 11 ee-bbbtable2
    ID ProjcetID Time
    1 3 2.00
    2 3 4.50
    3 10 1.00
    4 3 7.00
    5 12 1.00
    6 12 2.00
    7 9 2.00
    8 7 1.00
    9 7 3.00  用你给我的sql语句
    可得到Name     sum_time
    aaa 14.50
    bbb 9.00
    cc-aaa 13.50
    dd-bbb 3.00
    ee-bbb 4.00
    ff-bbb 2.00
    zz-aaa 1.00
    但是根据次级的project跟在顶级的project后面的要求,要把cc-aaa和zz-aaa跟在aaa后面
    Name     sum_time
    aaa 14.50
    cc-aaa 13.50
    zz-aaa 1.00
    bbb 9.00
    dd-bbb 3.00
    ff-bbb 2.00
    ee-bbb 4.00劳驾
    我有点怀疑是否能实现但是挺急得
      

  14.   

    初步设想到Name反转后再排序,也就是变成
    aaa
    aaa-cc
    aaa-zz
    bbb
    bbb-bb
    bbb-ff
    bbb-ee还要等试验过才知道
      

  15.   


    Name 的命名,在顶级project和次级project之间是没有任何联系的次级project的名字在实际中并不是以顶级project的名字作为末尾的。union是不是把两个数据集并起来的,并不是穿插进去的
      

  16.   

    不能用反转函数为:reverse()Name 的命名,在顶级project和次级project之间是没有任何联系的
    次级project的名字在实际中并不是以顶级project的名字作为末尾的。
      

  17.   

    从你给出的列子来看除了这个
    ff-bbb 2.00
    ee-bbb 4.00我觉得ee-bbb应该在前的,以外,排列也对了
    ------------------Name 的命名,在顶级project和次级project之间是没有任何联系的
    次级project的名字在实际中并不是以顶级project的名字作为末尾的。
    --------------------------
    我还是想请你列出几个具有代表性的Name出来
      

  18.   

    次级Project之间的顺序一般是按照name来排序
    我想你的排列应该是对的Name     sum_time
    aaa 14.50
    cccc 13.50
    zzzz 1.00
    bbb 9.00
    dddd 3.00
    ffff 2.00
    eeee 4.00
      

  19.   

    应该是:Name     sum_time
    aaa 14.50
    cccc 13.50
    zzzz 1.00
    bbb 9.00
    dddd 3.00
    eeee 4.00
    ffff 2.00
      

  20.   

    到底解决了没有?
    还有那个Name到底是怎么样的?怎么一次和一次都不同
      

  21.   

    没有解决
    你前面说,
    ------------------
    从你给出的列子来看除了这个
    ff-bbb 2.00
    ee-bbb 4.00我觉得ee-bbb应该在前的,以外,排列也对了
    ------------------
    我以为你解决了
    大概我理解错了
    --------------------------
    我还是想请你列出几个具有代表性的Name出来
    ----------------------------所以我就列出了一些没有任何关系的name
      

  22.   

    如果是这个的话,
    Name     sum_time
    aaa 14.50
    cc-aaa 13.50
    zz-aaa 1.00
    bbb 9.00
    dd-bbb 3.00
    ee-bbb 4.00
    ff-bbb 2.00反转以后就可以达到了,
    但我看不出你后面列出来的Name是什么意思
      

  23.   

    你看看这个语句能不能满足你的要求
    select d.Name ,sum_time from 
    (select a.ParentID as tt,sum(b.tt) as sum_time from table1 a,(select ProjectID,sum(Time)as tt from table2 group by ProjectID) b 
    where b.ProjectID=a.ProjectID group by a.ParentID
    union all
    select ProjectID as tt,sum(Time)as sum_time  from table2 group by ProjectID) c,table1 d 
    where c.tt=d.ProjectID order by reverse(Name)
      

  24.   

    可能没有说清楚table1 (只改了名字)
    ProjectID ParentID  Name
    1 -1 aaa
    11 -1 bbb
    3 1 cccc
    10 1 zzzz
    12 11 dddd
    9 11 ffff
    7 11 eeee table2 依然是:
    ID ProjcetID Time
    1 3 2.00
    2 3 4.50
    3 10 1.00
    4 3 7.00
    5 12 1.00
    6 12 2.00
    7 9 2.00
    8 7 1.00
    9 7 3.00按照sql语句,不管是order by reverse(name),还是order by name
    得到的是
    Name sum_name
    aaa 14.50
    bbb 9.00
    cccc 13.50
    dddd 3.00
    eeee 4.00
    ffff 2.00
    zzzz 1.00
    希望得到是
    Name     sum_time
    aaa 14.50
    cccc 13.50
    zzzz 1.00
    bbb 9.00
    dddd 3.00
    eeee 4.00
    ffff 2.00
    因为次级cccc,zzzz是顶级aaa下的,所以排列在aaa下
    同样,dddd,eeee,ffff在bbb下
      

  25.   


     你看这样对不对?create table #tf
    (projectid int primary key,
     parentid int,
     [Name] varchar(20),
     sumtime float(5)
    )
    insert #tf
    select d.projectid,d.parentid,d.Name ,sum_time 
    from 
     (select a.ParentID as tt,sum(b.tt) as sum_time from table1 a,
      (select ProjectID,sum(Time)as tt from table2 group by ProjectID) b 
    where b.ProjectID=a.ProjectID group by a.ParentID
    union all
    select ProjectID as tt,sum(Time)as sum_time  from table2 group by ProjectID)
     c,table1 d 
    where c.tt=d.ProjectID order by reverse(Name)update #tf set parentid=projectid where parentid=-1
    go
    select Name,sumtime from #tf order by parentid, sumtime desc
    drop table #tf
      

  26.   

    order by reverse(Name) 改成 order by Name
      

  27.   

    你上面没必要用反转了,
    还有,我觉得单单用Name来排序是错的,
    应该是先
    排ParentID,再排名,
    这里还有一个问题?你这个表是几级了?
    不会等一下搞出了两级的,你又说还有三级的吧
      

  28.   

    To  zjcxc(邹建)
    我会写成函数]
    一开始我没有看懂
    拖着 yjdn(无尽天空) 写了半天
    渐渐有点懂
    sql和sql server懂得不是很多,一直想找时间要补课推荐我一些好文章,好吗?To  yjdn(无尽天空)  :
    我会先排ParentID,再排名
    会改的-----------
    这里还有一个问题?你这个表是几级了?
    不会等一下搞出了两级的,你又说还有三级的吧
    ----------
    这个我不懂
    能不能解释一下?
      

  29.   

    这里还有一个问题?你这个表是几级了?
    不会等一下搞出了两级的,你又说还有三级的吧
    ----------
    这个我不懂
    能不能解释一下?
    --------------------
    我是说,你那表会不会是这样:
    ProjectID  ParentID  Name   
    1                  -1                 a
    2                  1                  b
    3                  2                  c
    那不变成三级的了?----------------------------
    如果用我的办法来的话,在排序以前增加一个列
    也就是,有父结点的,就父结点+原来的,
    比如:dddd父结点是aaa
    新列就是aaaddd,最后用这个列来排序就可以达到你要的效果了,
    今晚有事,没空帮你了,
    抱歉
      

  30.   

    怎么还没解决吗?
    这个是我刚想到的,没整理好,
    我变了一个方法,表一转为这样
    1 1 aaa
    11 11 bbb
    3 1 cccc
    10 1 zzzz
    12 11 dddd
    9 11 ffff
    7 11 eeeeorder by ParentID,Name 就可以得到你要的效果:
    select c.Name,d.sum_Time  from (select (case when ParentID>0 then ParentID else ProjectID end )as tt ,ProjectID ,Name from table1 ) c,
    (select a.ParentID as tt,sum(b.tt) as sum_time from table1 a,(select ProjectID,sum(Time)as tt from table2 group by ProjectID) b 
    where b.ProjectID=a.ProjectID group by a.ParentID
    union all
    select ProjectID as tt,sum(Time)as sum_time  from table2 group by ProjectID) d  
    where c.tt=d.tt order by  c.tt ,c.Name
      

  31.   

    我的表是两级的最后一行中,where c.tt=d.tt order by  c.tt ,c.Name
    需要改成where c.ProjectID=d.tt order by  c.tt ,c.Name否则不对你写的SQL,恐怕都不能保证顶级的project name排列在次级的project前面
    只能保证顶级和次级的project会排列在一块儿因为顶级project排在次级project前面,总时间总是顶级project最多,
    所以我又把
    where c.ProjectID=d.tt order by  c.tt ,c.Name
    改成了
    where c.ProjectID=d.tt order by  c.tt ,sum_Time descname的排列只能算了不知道我说的对不对?
      

  32.   

    foxmayfly(甫几)你的ParentID字段不就是顶级的ID吗?
    我先要把ParentID排序,再根据Name来排序,也就是顶级在前,同一顶级的,再按Name来排,这不是你的要求吗?用你的数据我得到了你要的结果,
      

  33.   

    如果顶级的project的name:aaa改成了daa,会发现
    顺序是:
    cccc
    zzzz
    daa顶级的project会排在次级的project后面
    我的数据仅仅是用来测试
    真实的数据会发生这样的问题的
      

  34.   

    如果顶级的project的name:aaa改成了daa,会发现
    顺序是:
    cccc
    daa
    zzzz顶级的project会排在次级的project后面我的数据仅仅是用来测试
    真实的数据会发生这样的问题的
      

  35.   

    改成了
    where c.ProjectID=d.tt order by  c.tt ,sum_Time desc
    ------------------------------------------------
    呵呵,就错在这了,--------------------------------------
    本来想叫你用这个方法:
    --------------------
    如果用我的办法来的话,在排序以前增加一个列
    也就是,有父结点的,就父结点+原来的,
    比如:dddd父结点是aaa
    新列就是aaaddd,最后用这个列来排序就可以达到你要的效果了,
    ------------------------------------
    但是这样的话,就会:
    如:
    1        tttt
    11       aaaa
    这样的父结点,不知道你是按数字来排还是字母来排?-----------------------------------------
    另建议另开一帖,把你的问题描述清楚,请各位星星看看,必竟我也只有三个三角,
    没有多大的自信:)
      

  36.   

    互相学习
    我必须去整理一下我觉得我必须找时间把sql系统学习一下
    否则碰到问题后,去找,去问,浪费了不少时间拖了你一天
    谢谢你也谢谢 zjcxc(邹建)
      

  37.   

    还有,要有自信哦zjcxc(邹建)也不是一天两天达到这样的水平
    毕竟邹老大也是不断地学习,不断地领悟的我们有老大这样的榜样,就会不断长进。