SQL Server循环查询

时间:2014-10-13 08:33:48

标签: sql sql-server

我有4个表,因为我想从所有4个表中获取记录并聚合值

我有这些表

enter image description here

我期待这个输出

enter image description here

但是将此输出作为笛卡尔积?

enter image description here

将费用和分配相乘

这是我的查询

select 
    a.NAME, b.P_NAME,
    sum(a.DURATION) DURATION,
    sum(b.[EXP]) EXPEN 
from
    (select 
         e.ID, a.P_ID, e.NAME, a.DURATION DURATION 
     from 
         EMPLOYEE e 
     inner join 
         ALLOCATION a ON e.ID = a.E_ID) a
inner join 
    (select 
         p.P_ID, e.E_ID, p.P_NAME, e.amt [EXP] 
     from 
         PROJECT p 
     inner join 
         EXPENSES e ON p.P_ID = e.P_ID) b ON a.ID = b.E_ID 
                                          and a.P_ID = b.P_ID 
group by 
    a.NAME, b.P_NAME

任何人都可以对此提出一些建议。

3 个答案:

答案 0 :(得分:3)

以下内容应该有效:

SELECT e.Name,p.Name,COALESCE(d.Duration,0),COALESCE(exp.Expen,0)
FROM
   Employee e
      CROSS JOIN
   Project p
      LEFT JOIN
   (SELECT E_ID,P_ID,SUM(Duration) as Duration FROM Allocation
    GROUP BY E_ID,P_ID) d
      ON
        e.E_ID = d.E_ID and
        p.P_ID = d.P_ID
      LEFT JOIN
   (SELECT E_ID,P_ID,SUM(AMT) as Expen FROM Expenses
    GROUP BY E_ID,P_ID) exp
      ON
         e.E_ID = exp.E_ID and
         p.P_ID = exp.P_ID
WHERE
    d.E_ID is not null or
    exp.E_ID is not null

我试图编写一个可以产生结果的查询,例如对于某些特定ExpensesAllocations组合,E_ID中有行但P_ID中没有行(反之亦然)。

答案 1 :(得分:0)

通过传递所有表的公共ID

在select查询中使用左连接

答案 2 :(得分:0)

您好我从查询中的一些修改得到了我想要的答案

上面的查询也像魅力一样工作,并对原始查询做了一些修改并得到了答案

只需按内部查询分组,然后加入查询,然后不显示笛卡尔积

这是更新的

select a.NAME,b.P_NAME,sum(a.DURATION) DURATION,sum(b.[EXP]) EXPEN from

(select e.ID,a.P_ID, e.NAME,sum(a.DURATION) DURATION from EMPLOYEE e inner join ALLOCATION a
ON e.ID=a.E_ID group by e.ID,e.NAME,a.P_ID) a

inner join 

(select p.P_ID,e.E_ID, p.P_NAME,sum(e.amt) [EXP] from PROJECT p inner join EXPENSES e 
ON p.P_ID=e.P_ID group by p.P_ID,p.P_NAME,e.E_ID) b 

ON a.ID=b.e_ID and a.P_ID=b.P_ID group by a.NAME,b.P_NAME

显示正确的输出