//试试
select a.部门,c.类别,sum(price) as price
from Dept a
left join Orders b
on a.部门=b.部门
inner join Class c 
on b.cid=c.cid
group by a.部门,c.类别

解决方案 »

  1.   

    to: frankwong,你的方法只能把Orders表中已有的数据提出来,没有注意我最重要一句话“但所有在Dept和Class表中的数据都必须列出”,看看我结果中的样式就明白了。
    to: xw32designer,Oders表中的[部门]对应Dept表中的[部门],Order表中的cid对应Class表中的cid另外,这个功能我已经用存储过程的游标嵌套法实现了,先建一个目标临时表,然后一个个循环添加进这个临时表,但很笨。
    不管有没有答案,星期一晚上结贴!按字数多少给分^_^
      

  2.   

    select 部门,类别,isNull((select sum(price) from 表 where 部门= a.部门 and 类别 = a.类别),0)
    from 表 a
    group by 部门,类别
      

  3.   

    Dept和Class没有完整的对应关系,怎么可能得到"所有在Dept和Class表中的数据都必须列出"的结果,表中Dept和Class的对应关系只能从Orders中得到,既然是这样,就肯定只能显示Orders里面有的Dept和Class了
      

  4.   

    --如果你的每个部门都是有两个类别,不如这样:
    select 部门,类别,isnull((select sum(price) from Orders where 部门=a.部门 and cid=(select cid from class where 类别=a.类别)),0) as price
    from (
    select 部门,'基建' as 类别
    from Dept 
    union all
    select 部门,'生产' as 类别) a
    --这样子Class有点象鸡肋了
      

  5.   

    可不可以理解成在每个部门下的类别都一样?因为dept和class没有关联啊select sum(isnull(price,0)) as price,dept.部门,classs.类别
    from  dept join class on 1=1 left  join orders on orders.cid=class.cid and dept.部门=orders.部门
    group by dept.部门,class.类别,dept.did
    order by dept.did
    这个可以实现你的要求
    以下是测试:
    create table dept(did int,部门 varchar(50))
    create table orders(ord int,price money,部门 varchar(50),cid int)
    create table classs(cid int,类别 varchar(50))insert into dept values(1,'工程部')
    insert into dept values(2,'运行部')
    insert into dept values(3,'办公室')insert into class values(1,'基建')
    insert into class values(2,'生产')insert into orders values(1,7743.60,'工程部',2)
    insert into orders values(2,104.88,'运行部',2)
    不过还是建议你将dept和class关联一下,在dept中加入cid