Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
oraclesql条件算法_Sql_Oracle_Conditional - Fatal编程技术网

oraclesql条件算法

oraclesql条件算法,sql,oracle,conditional,Sql,Oracle,Conditional,我有一个列出员工id、代码、工时和工资的数据集。任何1名员工都可以拥有OT1或OT2中的1名,也可以同时拥有1行。它的缺点是,我需要将所有的工资相加,但如果他们有两个代码,则只需取OT1的金额。然后我想用我所说的条件下的总工资除以小时数。示例数据: + -------+------+-------+--------+ | ID | CODE | HOURS | AMOUNT | + -------+------+-------+--------+ | 123456 | OT1 | 10

我有一个列出员工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 | + -------+-------+--------+---------+
通过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