0

特定の期間に働いた従業員と、その期間に働いた時間を見つけようとしています。私のクエリは、従業員 ID を pk として持ち、有効日と有効期限日を従業員の位置の時間測定として使用する従業員テーブルを、支払期間 ID 番号を pk として持ち、有効日と有効期限も使用する計時テーブルに結合する必要があります。

従業員テーブルの有効期限の問題は、従業員が現在雇用されている場合、日付が「12/31/9999」になることです。特定の年に働いた従業員と現在の従業員、および給与期間ごとに働いた時間を探しています。

ORステートメントを使用してwhereでこの条件を考慮すると、探している期間以降に働いた従業員である重複と、「12/31/9999」と有効なレコードの重複レコードが取得されます当時の社員。

これは私が使用しているクエリです:

SELECT
            J.EMPL_ID
            ,J.DEPT
            ,J.UNIT
            ,J.LAST_NM
            ,J.FIRST_NM
            ,J.TITLE 
            ,J.EFF_DT
            ,J.EXP_DT
            ,TM1.PPRD_ID
            ,TM1.EMPL_ID
            ,TM1.EXP_DT
            ,TM1.EFF_DT

            --PULLING IN THE DAILY HRS WORKED
             ,(SELECT NVL(SUM(((to_number(SUBSTR(TI.DAY_1, 1
                            ,INSTR(TI.DAY_1, ':', 1, 1)-1),99))*60)+
                (TO_NUMBER(SUBSTR(TI.DAY_1
                            ,INSTR(TI.DAY_1,':', -1, 1)+1),99))),0)
              FROM PPRD_LINE TI
              WHERE
              TI.PPRD_ID=TM1.PPRD_ID
              ) "DAY1"
             ---AND THE REST OF THE DAYS FOR THE WORK PERIOD
    FROM    PPRD_LINE TM1
    JOIN    EMPL J ON TM1.EMPL_ID=J.EMPL_ID

 WHERE
    J.EMPL_ID='some id number' --for test purposes, will need to break down to depts-
    AND
    J.EFF_DT >=TO_DATE('1/1/2012','MM/DD/YYYY')
    AND
    (
    J.EXP_DT<=TO_DATE('12/31/2012','MM/DD/YYYY')
    OR
    J.EXP_DT=TO_DATE('12/31/9999','MM/DD/YYYY') --I think the problem might be here???
    )

GROUP BY

    J.EMPL_ID
    ,J.DEPT
    ,J.UNIT
    ,J.LAST_NM
    ,J.FIRST_NM
    ,J.TITLE 
    ,J.EFF_DT
    ,J.EXP_DT
    ,TM1.PPRD_ID
    ,TM1.EMPL_ID
    ,TM1.DOC_ID
    ,TM1.EXP_DT
    ,TM1.EFF_DT

ORDER BY
    J.EFF_DT
    ,TM1.EFF_DT
    ,TM1.EXP_DT

単純なものが欠けていると確信していますが、この時点では、木を見て森を見ることができません。誰かが私を正しい方向に向けることができますか?

重複レコードの例:

2012 年の従業員 1 の場合:

Empl_ID Dept Unit   Last     First   Title   Eff Date Exp Date   PPRD ID Empl_ID
00001   04   012    Babbage  Charles Somejob 4/1/2012 10/15/2012 0407123 00001 

Exp Date_1 Eff Date_1
4/15/2012  4/1/2012

この記録は 3 回繰り返され、2012 年の支払い期間を過ぎて 2013 年の現在の支払い期間になります。

時間と分を足し合わせて比較できるように時間を変換するために使用するサブクエリ。

4

1 に答える 1

0

私はワイルドな推測をして、これがあなたが望むものかどうかを確認します。テストできなかったので、タイプミスがあるかもしれないことを覚えておいてください.

そうである場合、特にそうでない場合は、よくある質問の仕方について FAQ を読む必要があります。これがあなたが理解しようとしていたものである場合、あなたの質問は約 10 分以内に回答されているはずです。あなたが何を求めているのかが明確ではなかったので、誰もあなたの質問に答えることができませんでした.

質問には、入力と出力、および期待される出力を含める必要があります。指定したデータは、選択ステートメントの出力ではありません (DAY1 列がありませんでした)。

SELECT
   J.EMPL_ID
   ,J.DEPT
   ,J.UNIT
   ,J.LAST_NM
   ,J.FIRST_NM
   ,J.TITLE 
   ,J.EFF_DT
   ,J.EXP_DT
   ,TM1.PPRD_ID
   ,TM1.EMPL_ID
--  ,TM1.EXP_DT  Can't have these if you are summing accross multiple records.
--   ,TM1.EFF_DT
   --PULLING IN THE DAILY HRS WORKED
   ,NVL(SUM(((to_number(SUBSTR(TM1.DAY_1, 1,INSTR(TM1.DAY_1, ':', 1, 1)-1),99))*60)+
             (TO_NUMBER(SUBSTR(TM1.DAY_1,INSTR(TM1.DAY_1,':', -1, 1)+1),99))),0)
               "DAY1"
             ---AND THE REST OF THE DAYS FOR THE WORK PERIOD
FROM    PPRD_LINE TM1
JOIN    EMPL J ON TM1.EMPL_ID=J.EMPL_ID
WHERE
  J.EMPL_ID='some id number' --for test purposes, will need to break down to depts-

  AND J.EFF_DT >=TO_DATE('1/1/2012','MM/DD/YYYY')  
  AND(J.EXP_DT<=TO_DATE('12/31/2012','MM/DD/YYYY') OR J.EXP_DT=TO_DATE('12/31/9999','MM/DD/YYYY'))
GROUP BY
    J.EMPL_ID
   ,J.DEPT
   ,J.UNIT
   ,J.LAST_NM
   ,J.FIRST_NM
   ,J.TITLE 
   ,TM1.PPRD_ID
   ,TM1.EMPL_ID
   ,TM1.DOC_ID
ORDER BY
    MIN(J.EFF_DT)
   ,MAX(TM1.EFF_DT)
   ,MAX(TM1.EXP_DT)
于 2013-03-26T14:40:38.360 に答える