Как сделать СУММУ с условиями? - PullRequest
1 голос
/ 03 марта 2011

Мне нужно создать SQL-запрос для расчета количества часов сотрудников, работающих на конкретного клиента (n ° 108538).Мы различаем два типа подсчета: те, кто работал всю неделю (37: 50) и те, кто работал только в субботу и воскресенье (22: 50).

Чтобы не оштрафовать их, было решено предложить им бонус в 15 часов.
Чтобы узнать, кто работал только в выходные дни, мы используем конкретную категорию в их контракте, n ° 206.У других сотрудников есть другие категории (001, 250, 604 ...), поэтому я не могу сделать простой GROUP BY для этой категории.

Цель запроса - подсчитать количество отработанных часов всемисотрудник с января 2008 года по март 2011 года, принимая во внимание «часы», предлагаемые тем, кто работает только в выходные дни.

Я думал, используя EXISTS, чтобы знать, когда добавить эти бонусные часы, но я не получаюжелаемый результат.

Это запрос, который я написал:

SELECT   employee.name, employee.surname, SUM(timesheet.hours_par_day + 
            (CASE
                WHEN EXISTS (
                      SELECT *
                        FROM (SELECT contract.contrat_id
                                FROM contract, contract_categories
                               WHERE contract.customer_id = '108538'
                                 AND contract.begin_date BETWEEN '01/01/2008' AND '01/03/2011'
                                 AND contract_categories.contract_id = contract_categories.id_avenant
                                 AND contract_categories.id_category = '206') ctrsd
                       WHERE ctrsd.contrat_id = contract.contrat_id)
                   THEN 15
                ELSE 0
            END
            )
        ) AS hours_worked
FROM contract JOIN employee ON contract.employee_id = employee.employee_id
     JOIN timesheet ON contract.contrat_id = timesheet.contrat_id
WHERE contract.customer_id = '108538'
 AND contract.begin_date BETWEEN '01/01/2008' AND '01/03/2011'
 AND employee .employee_id IN (
                   SELECT employee_id
                     FROM contract
                    WHERE contract.client_id = '108538' AND contract.end_date >= '01/01/2011')

Он рассчитывается правильно ... но не включает дополнительные 15 часов.Я предполагаю, что неправильно использую EXISTS, но я не знаю, что еще я могу использовать ... у кого-нибудь есть идеи?

1 Ответ

1 голос
/ 03 марта 2011

Я думаю, что в этом случае вам не нужен подзапрос в CASE, вы можете вместо этого использовать внешнее объединение (хотя я не уверен, откуда берется "contract_financial" - может быть, таблица отсутствует?):

SELECT   employee.name, employee.surname, SUM(timesheet.hours_par_day + 
            (CASE
                WHEN contract.id_category = '206'
                THEN 15
                ELSE 0
            END
            )
        ) AS hours_worked
FROM contract JOIN employee ON contract.employee_id = employee.employee_id
     JOIN timesheet ON contract.contrat_id = timesheet.contrat_id
     LEFT JOIN contract_categories
     ON contract.contract_id = contract_categories.contract_id
WHERE contract.customer_id = '108538'
 AND contract.begin_date BETWEEN '01/01/2008' AND '01/03/2011'
 AND employee .employee_id IN (
            SELECT employee_id
            FROM contract
            WHERE contract.client_id = '108538'
            AND contract.end_date >= '01/01/2011')
...