Sql 如何用条件求和?

Sql 如何用条件求和?,sql,oracle,exists,Sql,Oracle,Exists,我需要创建一个SQL查询,用于计算为特定客户(n°108538)工作的员工小时数。我们区分了两种计数类型:一种是整周工作的人(37h50),另一种是只在周六和周日工作的人(22h50) 为了不惩罚他们,决定给他们15小时奖金。 为了知道谁只在周末工作,我们在他们的合同中使用了一个特定的类别,n°206。其他员工有其他类别(001、250、604…),因此我无法根据该类别进行简单分组 请求的目的是计算2008年1月至2011年3月期间所有员工的工作小时数,同时考虑到仅在周末工作的员工的“工作时间”

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

为了不惩罚他们,决定给他们15小时奖金。
为了知道谁只在周末工作,我们在他们的合同中使用了一个特定的类别,n°206。其他员工有其他类别(001、250、604…),因此我无法根据该类别进行简单分组

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

我想用它来知道什么时候应该增加这些额外的时间,但是我没有得到想要的结果

这是我写的查询:

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

我认为在这种情况下,您不需要子查询。在这种情况下,您可以改为使用外部联接(尽管我不确定“contract\u financial”的来源-可能缺少一个表):


我认为在这种情况下,您不需要子查询,而是可以使用外部联接(尽管我不确定“contract\u 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')