oraclesql条件算法
我有一个列出员工id、代码、工时和工资的数据集。任何1名员工都可以拥有OT1或OT2中的1名,也可以同时拥有1行。它的缺点是,我需要将所有的工资相加,但如果他们有两个代码,则只需取OT1的金额。然后我想用我所说的条件下的总工资除以小时数。示例数据: + -------+------+-------+--------+ | ID | CODE | HOURS | AMOUNT | + -------+------+-------+--------+ | 123456 | OT1 | 10 | 80 | | 789000 | OT1 | 8 | 120 | | 789000 | OT2 | 8 | 60 | | 654111 | OT2 | 4 | 40 | + -------+------+-------+--------+ 我正在尝试添加一个新列,以将金额除以小时,并将删除代码列,这样我们就可以将每个员工的总数相加为一条记录。问题是,如果员工同时拥有OT1和OT2,我不想求和,我只想要OT1的小时数。该逻辑手动应用于我前面的示例 + -------+-------+--------+---------+ | ID | HOURS | AMOUNT | AVERAGE | + -------+-------+--------+---------+ | 123456 | 10 | 80 | 8 | | 789000 | 8 | 180 | 22.5 | | 654111 | 4 | 40 | 10 | + -------+-------+--------+---------+oraclesql条件算法,sql,oracle,conditional,Sql,Oracle,Conditional,我有一个列出员工id、代码、工时和工资的数据集。任何1名员工都可以拥有OT1或OT2中的1名,也可以同时拥有1行。它的缺点是,我需要将所有的工资相加,但如果他们有两个代码,则只需取OT1的金额。然后我想用我所说的条件下的总工资除以小时数。示例数据: + -------+------+-------+--------+ | ID | CODE | HOURS | AMOUNT | + -------+------+-------+--------+ | 123456 | OT1 | 10
通过Oracle的KEEP first,您可以获得第一个代码的时间:
通过Oracle的KEEP first,您可以获得第一个代码的时间:
可以使用条件聚合执行此操作:
select id,
coalesce(sum(case when code = 'OT1' then hours end),
sum(hours)
) as hours,
sum(amount) as amount,
(sum(amount) /
coalesce(sum(case when code = 'OT1' then hours end),
sum(hours)
)
) as average
from t
group by id
order by id;
此方法显式组合了多行中的值,因此,如果存在重复项,则应按预期工作。您可以使用条件聚合:
select id,
coalesce(sum(case when code = 'OT1' then hours end),
sum(hours)
) as hours,
sum(amount) as amount,
(sum(amount) /
coalesce(sum(case when code = 'OT1' then hours end),
sum(hours)
)
) as average
from t
group by id
order by id;
此方法显式地组合了多行中的值,因此如果存在重复项,则应按预期工作。显示您的sql代码。。我认为,小时列不属于您的输出。请删除它,或者向我们解释它在那里做什么。从数据中选择ID、CODE、SUMHOURS、SUMAMOUNT\u set GROUP BY ID、CODE,我需要输出中的小时数供最终用户查看。它本质上是每个IDI的小时数的总和/第一次出现。我很确定我可以通过不求和小时数列并按它分组来修复它。假设来自数据输入用户,如果他们有多个代码,他们在每个代码中的小时数总是相同的。我不会将此作为一个答案发布,以防有人想在OT1和OT2中的小时数不同的情况下更直观地解决此问题。但对于我的示例数据,需要对小时进行分组,将CTE中的金额相加,然后应用算术,将数据设置为SELECT ID、hours、SUMAUNT AS amount,从表格a GROUP BY ID、hours SELECT ID、hours、SUMAUNT AS amount、ROUNDSUMAMOUT/hours,从数据设置为GROUP BY ID、2,小时显示您的sql代码。我认为小时列不属于您的输出。请删除它,或者向我们解释它在那里做什么。从数据中选择ID、CODE、SUMHOURS、SUMAMOUNT\u set GROUP BY ID、CODE,我需要输出中的小时数供最终用户查看。它本质上是每个IDI的小时数的总和/第一次出现。我很确定我可以通过不求和小时数列并按它分组来修复它。假设来自数据输入用户,如果他们有多个代码,他们在每个代码中的小时数总是相同的。我不会将此作为一个答案发布,以防有人想在OT1和OT2中的小时数不同的情况下更直观地解决此问题。但对于我的示例数据,需要对小时进行分组,将CTE中的金额相加,然后应用该算法,将数据设置为SELECT ID、hours、SUMMOUNT AS amount,从表格a GROUP BY ID、hours SELECT ID、hours、SUMMOUNT AS amount、ROUNDSUMOUNT/hours,从数据设置为GROUP BY ID、hours