2017-05-17 2 views
0

私はこのようなクエリは、従業員の今日の給与を返す必要があり、私はそれぞれに基づいて給与(給与表示を返すクエリを生成したいどのように毎日することにより、次の30日間のグループのためのデータセットを返すために

select salary 
from employee_salary 
where sysdate between start_date and end_date. 

日 - 本当の問題は、同じクエリに

sysdate+1 between start_date and end_date 
sysdate+2 between start_date and end_date 

をインクリメントする方法である【選択給与は、次の30日間毎日で、従業員グループの労働時間)の数から列になります。それは毎日の仕事の給料の合計を生成します。 ので、データセットは

date  name salary 
sysdate+1 emp1 100 
sysdate+1 emp2 90 
sysdate+2 emp1 30 
................... 
sysdate+30 emp1 130 

のようになりますSYSDATE + xは、実際の日付を返しますのでご注意ください。次のsysdate + 30日間、このようなデータを返すようにクエリを変更するにはどうすればよいですか?

+0

サンプルデータとそのデータに基づいて予想される出力を表示します。 –

+0

私はあなたのテーブルのデータとあなたが期待しているものについて、より多くの情報を提供する必要があると思います。 – XING

+0

Employee_salaryには、名前、給与、開始日、終了日の列があります。だから私は各従業員がその日の範囲内にあるかどうか、毎日30日チェックしたいと思っています。 –

答えて

1

次の30日間のリストを生成する必要があります。カレンダーをemployee_salaryテーブルに参加させ、日付範囲でフィルタリングします。集計構文を使用して毎日の給与を合計します。

ので:

with cal as (
    select sysdate+level as dt  
    from dual 
    connect by level <= 30 
) 
select cal.dt as "date" 
     , sum(es.salary) as sal_daily_total 
from cal 
    left outer join employee_salary es 
    on es.start_date <= cal.dt 
    and es.end_date >= cal.dt 
group by cal.dt 

明らか暗礁がemployee _salary日付範囲は、それらをまたがる場合、合計は、週末と祝日のための計算給与が含まれるということです。それが問題であれば、あなたの質問を編集して、あなたの必要条件を明確にしてください。

+0

私は質問を編集しました。どうぞご覧ください –

+0

私の解決策を無効にするあなたのリビジョンには何も表示されません。だから私はそれを試して、それがどのように動作するかを見ることをお勧めします。 – APC

+1

周りを微調整した後、いくつかの変更を加えて動作させることができました。ありがとうございました –

関連する問題