Oracle SQL条件运算

沙鹰

我有一个列出雇员ID,代码,工时和工资的数据集。任何1名员工都可以同时拥有OT1或OT2中的1名,或者两者都有1行。简而言之,我需要将所有工资加起来,但是如果它们都有这两个代码,就只能算出OT1的金额。然后,我想按我所说的条件将总工资除以小时数。示例数据:

+ ------- + ------ + ------- + -------- + 
| ID | 代码| 小时| 金额| 
+ ------- + ------ + ------- + -------- + 
| 123456 | OT1 | 10 | 80 | 
| 789000 | OT1 | 8 | 120 | 
| 789000 | OT2 | 8 | 60 | 
| 654111 | OT2 | 4 | 40 | 
+ ------- + ------ + ------- + -------- +

我试图添加一个新列以按小时数除以金额,并将删除代码列,以便我们可以将每个员工的总和汇总为一条记录。问题是,如果员工同时拥有OT1和OT2,我不想将它们加总,我只想从OT1开始的时间。该逻辑手动应用于我之前的示例

+ ------- + ------- + -------- + --------- + 
| ID | 小时| 金额| 平均 
+ ------- + ------- + -------- + --------- + 
| 123456 | 10 | 80 | 8 | 
| 789000 | 8 | 180 | 22.5 | 
| 654111 | 4 | 40 | 10 | 
+ ------- + ------- + -------- + --------- +
戈登·利诺夫

您可以使用条件聚合来做到这一点:

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;

该方法显式地组合了多行中的值,因此,如果有重复项,它应该可以按预期工作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章