1

请记住,这需要在 SQL 中完成 - 而不是 PL/SQL,这里没有 while 循环。

我需要从带有数量的单行到数量分散的多行。这是详细信息;

我有一条规则,当员工在一段时间内短缺时奖励替代时间。但是,此规则将奖励期间最后一天的所有时间,并且客户希望将其分散为 8 小时/天。

例如,如果 EE 不足 25 小时 - 现有规则将在该期间的最后一天授予该 25 小时。客户希望最后一天 8 小时,最后 2 天 8 小时,最后 3 天 8 小时,最后 4 天 1 小时。

我的 SQL 很棒,但我在这个上画了一个空白。有什么建议么?同样,不允许使用 PL/SQL 或 while 循环,必须在 SQL (Oracle) 中完成。

样本数据

从此开始;

**身份证日期金额**
1 2013 年 9 月 30 日 25

需要结束这个;

**身份证日期金额**
1 2013 年 9 月 30 日 8
1 2013 年 9 月 29 日 8
1 2013 年 9 月 28 日 8
1 2013 年 9 月 27 日 1
4

2 回答 2

2

如果单个员工的这些时间段不重叠,您也可以尝试以下操作:

select  distinct id, "date"-(level-1) "date", least(amount-(level-1)*8, 8) amount
from    sample_data
connect by amount > (level-1)*8
order   by id, "date" desc
于 2013-09-20T16:52:15.203 回答
1

如果您创建一个包含所有可能日期的表,则可以交叉加入该表。也许该表有一个实际日期,但它在每一行上也有一个天数:1、2、3、4...这是您要分配时间的顺序:即第 1 天的 8 小时,任何剩余(但最多 8 个)到第 2 天,依此类推。

对于任何特定的 day_num,表达式 ( (day_num - 1) * 8 ) 将为您提供最大值。已经可以分配的小时数。仅当员工的工作时间超过此时间时,此特定日期才会获得分配。此外,分配必须限制为 8。

SQL 如下所示。(有关架构,请参阅此 SQL 小提琴

select emp_id, total_hours, day_num,
       case 
          when total_hours - ((day_num-1) * 8) > 8 then 8
          when total_hours - ((day_num-1) * 8) < 0 then 0
          else total_hours - ((day_num-1) * 8) 
       end hours_for_day
from emp_short
cross join all_days
where total_hours - ((day_num-1) * 8) > 0 
于 2013-09-20T15:16:28.363 回答