2017-04-06 7 views
0

最初に私はSQLのエキスパートではありません。だからこそ、助けを求めるのです。 私は、遅刻の出席日を含む従業員の出席記録を含むOracleビューを持っています。 列:グループに値を持つ最初の2つのローのフラグを設定します

従業員は、数値、日付は、インタイム、アウト時間、Late_Arrival私は、各従業員が月の2回の遅刻などを拳マークしたい

(後半現在は「1」としてマーク取得した場合) "G"。クエリから。

私にこれを手伝ってください。

SELECT l.EMP_NO,l.ACCOUNT_DATE,l.IN_TIME,l.OUT_TIME,l.LATE_COMING_15 as 
late_arrival, 
      (case when l.LATE_COMING_15 = 1 and 
      row_number() over (partition by trunc(l.ACCOUNT_DATE),l.LATE_COMING_15 
order by l.IN_TIME 
          ) <= 2 
    then 'G' 
end) as flag 
from LATE_EARLYDEP l 

WHERE trunc(l.ACCOUNT_DATE) >= to_date('&DATE_FROM','dd/MM/yy') AND 
trunc(l.ACCOUNT_DATE) <=to_date ('&DATE_TO','dd/MM/yy') 

order by 1,2` 

しかし、依然として必要な結果が得られていません。例の従業員番号0005の羽ばたき日は02/03/2017 & 06/03/2017でなければなりません。私はこのロジックhttps://drive.google.com/open?id=0B6Xw1eXeLyG7M3dtbmJUek5OdG8

答えて

1

結果

グーグル・ドライブ・リンクの下に結果をアップロードしています

 row_number() over (partition by trunc(l.ACCOUNT_DATE), l.LATE_COMING_15 
         order by l.IN_TIME) 

はない各のために、各の行を列挙しています。 (PARTITION BYを参照)

 row_number() over (partition by l.emp_no, trunc(l.ACCOUNT_DATE, 'MON'), l.LATE_COMING_15 
         order by l.IN_TIME) 
+0

を有するもの遅いレコードをマークします。以下のgoogleドライブの結果を参照してください。どうもありがとうございます。 https://drive.google.com/open?id=0B6Xw1eXeLyG7MkJPd2lTamRVa2M –

+0

@KavinduAnthony。 。 。私は、問題は 'by by by partition by'の 'emp_no'の欠如だと思っています。 –

0

は基本的に、あなたの記録はemployy、月にを分割し、後半とOKの場合に分離Row_numberする必要があります:あなたは月あたり最初の二つをしたい場合は、partition by句を変更する必要があります を入力し、必要に応じて発注日に発注してください。 最後Gで依然として必要結果にフラグを設定しない行番号1または2

create table IMLATE as 
select 1 emp_no, to_date('01012017','ddmmyyyy') ACCOUNT_DATE, 1 late_arrival from dual union all 
select 1 emp_no, to_date('02012017','ddmmyyyy') ACCOUNT_DATE, 0 late_arrival from dual union all 
select 1 emp_no, to_date('03012017','ddmmyyyy') ACCOUNT_DATE, 1 late_arrival from dual union all 
select 1 emp_no, to_date('04012017','ddmmyyyy') ACCOUNT_DATE, 1 late_arrival from dual union all 
select 1 emp_no, to_date('01022017','ddmmyyyy') ACCOUNT_DATE, 1 late_arrival from dual; 

with late as (
select EMP_NO, ACCOUNT_DATE, LATE_ARRIVAL, 
ROW_NUMBER() over (partition by EMP_NO, trunc(ACCOUNT_DATE,'MM'), LATE_ARRIVAL order by ACCOUNT_DATE) as rn 
from IMLATE) 
select EMP_NO, ACCOUNT_DATE, LATE_ARRIVAL, 
case when late_arrival = 1 and rn in (1,2) then 'G' end sample_late 
from late 
order by emp_no, ACCOUNT_DATE; 

結果

EMP_NO ACCOUNT_DATE  LATE_ARRIVAL SAMPLE_LATE 
---------- ------------------- ------------ ----------- 
     1 01-01-2017 00:00:00   1 G   
     1 02-01-2017 00:00:00   0    
     1 03-01-2017 00:00:00   1 G   
     1 04-01-2017 00:00:00   1    
     1 01-02-2017 00:00:00   1 G 
関連する問題