2009-03-03 43 views
0

従業員を取得する方法、有効な日付のレコードで未来の行がない5つの最新Action_reason行は、現在の行と履歴行(有効日は< = sysdate)のみを選択する必要があります。これらを1行でフェッチすることはできますか、それとも従業員は5行ですか?有効期限付きレコードの使用

select emplid, effdt, action_reasons 
-- we have to build a logic here. 
-- Should we initialize 5 ACT variables to fetch rows into it? 
-- Please help 
from JOB 
where emplid = '12345' 
    and effdt <= sysdate. 
+0

なぜ1つの行が必要ですか? 4つのアクション理由行しかない人のために行に何をしたいですか? 3、あなたは、@ Quasssnoiのソリューションで提供されているように、従業員1人あたり0〜5行のテーブルを持つ方がよいでしょうか? –

+0

0行と5行は従業員の最新の5行をフェッチしますが、アクション理由は同じである可能性があります。私は5つの最新のアクション理由を取りたいです。 2-3行しか変更されていない場合、残りの2行は空白になります。これは報告目的のためのものです。 –

答えて

3
SELECT LTRIM(SYS_CONNECT_BY_PATH(emplid || ', ' || effdt || ', ' || action_reasons, ', '), ', ') 
FROM (
     SELECT 
     FROM (
      SELECT emplid, effdt, action_reasons, ROW_NUMBER() OVER (ORDER BY effdt) AS rn 
      FROM JOB 
      WHERE emplid= '12345' 
       AND effdt <= SYSDATE 
      ) 
     WHERE rn <= 5 
     ) 
WHERE CONNECT_BY_ISLEAF = 1 
START WITH 
    rn = 1 
CONNECT BY 
    rn = PRIOR rn + 1 
+0

従業員(5つのアクションを想定)を最新のものから最後のものまで、対応するものから取得するにはどうすればいいですか? –

+0

申し訳ありませんが、私はあなたが望むものを手に入れません。あなたの質問にサンプルデータと希望の結果を投稿してください。 – Quassnoi

+0

彼は望んでいます:emplid、effdt1、act1、effdt2、act2、effdt3、act3、...;もちろん、これは特に良い考えではありません。 –

0
SELECT JOBXX.EMPLID,JOBXX.EFFDT,JOBXX.ACT1,JOBXX.ACT2,JOBXX.ACT3,JOBXX.ACT4,JOBXX.ACT5 
FROM 
    (SELECT SD.EMPLID, 
      SD.EFFDT, 
      CHR(SUBSTR(TO_CHAR(SUM(CASE WHEN SD.R3 = 1 THEN SD.A1 ELSE 0 END)),1,2)) || 
      CHR(SUBSTR(TO_CHAR(SUM(CASE WHEN SD.R3 = 1 THEN SD.A1 ELSE 0 END)),3,2)) || 
      CHR(SUBSTR(TO_CHAR(SUM(CASE WHEN SD.R3 = 1 THEN SD.A1 ELSE 0 END)),5,2)) 
      AS ACT1, 
      CHR(SUBSTR(TO_CHAR(SUM(CASE WHEN SD.R3 = 2 THEN SD.A1 ELSE 0 END)),1,2)) || 
      CHR(SUBSTR(TO_CHAR(SUM(CASE WHEN SD.R3 = 2 THEN SD.A1 ELSE 0 END)),3,2)) || 
      CHR(SUBSTR(TO_CHAR(SUM(CASE WHEN SD.R3 = 2 THEN SD.A1 ELSE 0 END)),5,2)) 
      AS ACT2, 
      CHR(SUBSTR(TO_CHAR(SUM(CASE WHEN SD.R3 = 3 THEN SD.A1 ELSE 0 END)),1,2)) || 
      CHR(SUBSTR(TO_CHAR(SUM(CASE WHEN SD.R3 = 3 THEN SD.A1 ELSE 0 END)),3,2)) || 
      CHR(SUBSTR(TO_CHAR(SUM(CASE WHEN SD.R3 = 3 THEN SD.A1 ELSE 0 END)),5,2)) 
      AS ACT3, 
      CHR(SUBSTR(TO_CHAR(SUM(CASE WHEN SD.R3 = 4 THEN SD.A1 ELSE 0 END)),1,2)) || 
      CHR(SUBSTR(TO_CHAR(SUM(CASE WHEN SD.R3 = 4 THEN SD.A1 ELSE 0 END)),3,2)) || 
      CHR(SUBSTR(TO_CHAR(SUM(CASE WHEN SD.R3 = 4 THEN SD.A1 ELSE 0 END)),5,2)) 
      AS ACT4, 
      CHR(SUBSTR(TO_CHAR(SUM(CASE WHEN SD.R3 = 5 THEN SD.A1 ELSE 0 END)),1,2)) || 
      CHR(SUBSTR(TO_CHAR(SUM(CASE WHEN SD.R3 = 5 THEN SD.A1 ELSE 0 END)),3,2)) || 
      CHR(SUBSTR(TO_CHAR(SUM(CASE WHEN SD.R3 = 5 THEN SD.A1 ELSE 0 END)),5,2)) 
      AS ACT5 
    FROM (
     SELECT EMPLID,EFFDT,ACTION_REASON, 
       SUBSTR(ACTION_REASON,1,1), 
       SUBSTR(ACTION_REASON,2,1), 
       SUBSTR(ACTION_REASON,3,1), 
       TO_NUMBER(ASCII(SUBSTR(ACTION_REASON,1,1)) || 
       ASCII(SUBSTR(ACTION_REASON,2,1)) || 
       ASCII(SUBSTR(ACTION_REASON,3,1))) AS A1, 
       ROW_NUMBER() over(PARTITION BY EMPLID,EFFDT ORDER BY EFFDT desc,EFFSEQ desC) R3 
     FROM PS_JOB 
     WHERE action in ('ABC','XYZ') 
     and action_reason in ('123','456','789') 
     and emplid IN('12345','ABCDE') 
     AND effdt between '01-jan-2008' and '18-dec-2008' 
     ORDER BY EFFDT DESC, EFFSEQ DESC 
    ) SD       
    GROUP BY EMPLID , EFFDT    
) JOBXX 
0

あなたはデータにあなたが望む任意の方法を持つことができます。あなたはすべての単一ライン上のデータが必要な場合は、このように、OracleのLAG解析関数を使用し

select * from (
      select emplid, empl_rcd, effdt, action_reason 
        , rank() over (partition by emplid, empl_rcd 
           order by effdt desc, effseq desc) rank1 
       from ps_job 
       where emplid = '12345' 
       and effdt <= sysdate) 
where rank1 <= 5 

select * from ( 
    select emplid, empl_rcd, effdt 
     , lag(effdt) over(partition by emplid, empl_rcd order by effdt, effseq) effdt_lag1 
     , lag(effdt, 2) over(partition by emplid, empl_rcd order by effdt, effseq) effdt_lag2 
     , lag(effdt, 3) over(partition by emplid, empl_rcd order by effdt, effseq) effdt_lag3 
     , lag(effdt, 4) over(partition by emplid, empl_rcd order by effdt, effseq) effdt_lag4 
     , action_reason 
     , lag(action_reason) over(partition by emplid, empl_rcd order by effdt, effseq) action_reason_lag1 
     , lag(action_reason, 2) over(partition by emplid, empl_rcd order by effdt, effseq) action_reason_lag2 
     , lag(action_reason, 3) over(partition by emplid, empl_rcd order by effdt, effseq) action_reason_lag3 
     , lag(action_reason, 4) over(partition by emplid, empl_rcd order by effdt, effseq) action_reason_lag4 
     from ps_job 
    where emplid = '12345') j 
where effdt = (
      select max(j1.effdt) from ps_job j1 
      where j1.emplid = j.emplid 
       and j1.empl_rcd = j.empl_rcd 
       and j1.effdt <= sysdate) 

これが最後を与えるあなたは5行としてそれをしたいなら、あなたはこれを使用することができます5つのeffdt値と最後の5つの行動理由値。必要がない場合は、上記のSQLを両方とも適切に整えることができます。

関連する問題