1

これは SQL で行う必要があることに注意してください。PL/SQL ではなく、ここでは while ループを使用しません。

金額のある単一の行から、金額が広がった複数の行に移動する必要があります。詳細は次のとおりです。

従業員が一定期間不足している場合は、代わりの時間を与えるという規則があります。ただし、このルールでは、期間の最終日にすべての時間が割り当てられ、クライアントは 1 日 8 時間に分散することを望んでいます。

たとえば、EE が 25 時間と短い場合、既存のルールでは、期間の最終日にその 25 時間が割り当てられます。クライアントは、最終日に 8 時間、最終 2 日目に 8 時間、最終 3 日目に 8 時間、最終 4 日目に 1 時間を希望しています。

私の SQL は素晴らしいですが、これには空白を描いています。助言がありますか?ここでも、PL/SQL または while ループは許可されず、SQL (Oracle) で実行する必要があります。

サンプルデータ

これから始めます。

**ID 日付 金額**
1 2013/09/30 25

これで終わる必要があります。

**ID 日付 金額**
1 2013/09/30 8
1 2013/09/29 8
1 2013/09/28 8
1 2013/09/27 1
4

2 に答える 2

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 に答える