2014-09-19 7 views
0

отличные специалисты по SQL! :) Мой босс хочет месячный/годовой/дневный отчет о работе своего сотрудника. Я вычислил большинство запросов SQL, которые мне нужны, но последний из них выше моего понимания.SQL-запрос с двумя суммами

У меня есть несколько таблиц: лица, службы, планы и услуги. Табличные планы содержат индивидуальный план месяца для каждого человека на каждой службе. Поэтому мне нужен запрос, который возвращает общее значение услуг, предоставляемых каждым человеком в определенный период времени на конкретную услугу и суммарную стоимость запланированной рабочей суммы за тот же период на той же услуге. Теперь у меня есть что-то вроде этого:

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, она также суммирует планы, а не добавляет только предоставленную услугу в первый отчет о сумме.

Лицо 1, предоставленное Service1 три раза в августе 1, один раз в августе 3 и 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

Вы можете разместить фактические данные и желаемый результат? В какой БД есть MySQL, SQL-Server, Oracle, какая версия? Также вы можете опубликовать пример на [sqlfiddle] (http://sqlfiddle.com/) – Max

+1

Старые школы JOIN были дряхлыми в течение примерно 20 лет, используйте ключевое слово JOIN. – HoneyBadger

+0

Приведите пример на sqlfiddle.com – Max

ответ

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

+0

Нет. Это тоже не работает. Тот же результат, если я добавлю некоторые более рентабельные сервисы. Посмотрите http://sqlfiddle.com/#!3/72bce/1, он все еще дважды суммирует столбец Amount. –

+0

Я добавил три строки в таблицу A. –

Смежные вопросы