【问题标题】:How to make a SUM with conditions?如何根据条件进行 SUM?
【发布时间】:2011-07-07 21:51:02
【问题描述】:

我需要创建一个 SQL 查询来计算为特定客户 (n°108538) 工作的员工小时数。我们区分两种类型的计数:那些整周工作的人(37h50)和那些只在周六和周日工作的人(22h50)。

为了不惩罚他们,决定为他们提供 15 小时的奖金。
为了知道谁只在周末工作,我们在他们的合同中使用了一个特定的类别,即 n°206。其他员工有其他类别(001、250、604...),所以我无法对该类别进行简单的 GROUP BY。

请求的目的是计算所有员工从 2008 年 1 月到 2011 年 3 月的工作小时数,同时考虑“提供”给仅在周末工作的员工的小时数。

我想使用 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,但我不知道我还能用什么……有人知道吗?

【问题讨论】:

    标签: sql oracle exists


    【解决方案1】:

    我认为在这种情况下,您不需要 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')
    

    【讨论】:

    • 哎呀,抱歉,我更改了初始查询。匿名化和简化查询并不容易......
    • 感谢您的回答,我现在有一个更快的查询,但数据相同...我认为我的合同类别存在一些问题。
    猜你喜欢
    • 2015-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-12
    • 1970-01-01
    • 2022-08-08
    • 1970-01-01
    相关资源
    最近更新 更多