2014-09-19 32 views
0

伟大的sql专家! :) 我的老板希望每月/每年/每天的员工工作报告。我想到了大部分我需要的SQL查询,但最后一个超出了我的理解范围。SQL多语言查询与两个sum语句

我有几个表格:人员,服务,计划和ProvidedServices。表格计划包含每个服务上每个人的个人月计划。所以我需要一个查询,它返回每个人在特定服务的特定时间段提供的服务的总价值以及同一服务上同一时期计划工作量的汇总值。现在我有这样的事情:

SELECT SUM(BoRRenderedServices.ServiceCount), 
     BoREmployee.Name, 
     BoRServices.Service, 
     SUM(BoRTargets.Amount) 
FROM BoRRenderedServices, BoREmployee, BoRServices, BoRTargets 
WHERE (BoRTargets.EmployeeID = BoREmployee.ID) 
AND (BoRTargets.ServiceID = BoRServices.ID) 
AND (BoRRenderedServices.Date BETWEEN '2014-1-1' AND '2014-9-19') 
AND (BoREmployee.DepartmentID = 'cc42cac9-5ac7-4614-9b7b-ef931a9a132b') 
AND (BoRRenderedServices.EmployeeID = BoREmployee.ID) 
AND (BoRRenderedServices.ServiceID = BoRServices.ID) 
AND (BoRRenderedServices.ServiceID = '0fbf68bf-ace8-4ecb-ba07-7049046c0215') 
GROUP BY BoREmployee.Name, 
     BoRServices.Service 

但此查询使双总和,它总结了所提供的服务数量的两倍,这同样适用于计划。我的意思是,每次它发现为WHERE条件提供服务时 - 它也总结计划,而不是仅将提供的服务添加到第一个sum语句中。

人1,8月1日3次提供服务1次,8月3日1次,7月4日4次。 Person1八月份的计划是三次,七月份是四次。

所需的输出:
--------------Plan Fact Service1 1----------1 Service2 1----------2 Service3 1----------3
实际输出:
--------------Plan Fact Service1 3----------3 Service2 3----------6 Service3 3----------9

+1

你能后的实际数据和期望的输出?你有什么样的DB,MySQL,SQL-Server,Oracle,什么版本?您还可以在[sqlfiddle](http://sqlfiddle.com/)上发布示例 – Max 2014-09-19 08:05:29

+1

旧学校JOIN已经破旧大约20年了,请使用JOIN关键字。 – HoneyBadger 2014-09-19 08:16:33

+0

在sqlfiddle.com上提供一个示例 – Max 2014-09-26 10:14:32

回答

1

我更改查询。 你可以创建视图或你的sql数据库。

检查SqlFiddle

with tbl1 
as 
(
    SELECT 
     b.EmployeeId 
     ,b.ServiceId 
     ,c.Service 
     ,d.Name 
     ,Sum(b.Amount) Amount 
FROM 
    BoRTargets b 
     inner join BoRServices c 
    on b.ServiceId = c.Id 
     inner join BoREmployee d 
    on b.EmployeeId = d.Id 
WHERE (b.Date BETWEEN '2014-09-01' AND '2014-09-26') 
AND (d.DepartmentID = 'cc42cac9-5ac7-4614-9b7b-ef931a9a132b') 
GROUP BY b.EmployeeId, b.ServiceId, c.Service, d.Name 
) 
, 

tbl2 
as 
(
    SELECT 
     a.EmployeeId 
    ,a.ServiceId 
    ,c.Service 
    ,d.Name 
    ,SUM(a.ServiceCount) ServiceCount 
FROM 
    BoRRenderedServices a 
     inner join BoRServices c 
    on a.ServiceId = c.Id 
     inner join BoREmployee d 
    on a.EmployeeId = d.Id 
WHERE EXISTS(
    SELECT 1 
    FROM BorTargets b 
    where (a.EmployeeId = b.EmployeeId and a.ServiceId = b.ServiceId) 
    AND (b.Date BETWEEN '2014-09-01' AND '2014-09-26')) 
AND (d.DepartmentID = 'cc42cac9-5ac7-4614-9b7b-ef931a9a132b') 
GROUP BY a.EmployeeId, a.ServiceId, c.Service, d.Name 
) 

select coalesce(a.Service, b.Service) Service, coalesce(a.Name, b.Name) Name, a.Amount, b.ServiceCount 
from tbl1 a full join tbl2 b 
on a.EmployeeId = b.EmployeeId 
and a.ServiceId = b.ServiceId 
+0

如果没有问题,请将其标记为答案 – Max 2014-09-29 13:48:58

+0

不可以,同样的结果是,如果我添加了一些更多的呈现服务。看http://sqlfiddle.com/#!3/72bce/1,它仍然双倍总结Amount列。 – 2014-09-30 10:32:07

+0

我在表A中添加了三行。 – 2014-09-30 10:34:17