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