2011-06-29 21 views
-1

我有一個像這些在Oracle 10g數據庫SQL拿到兩列

`with t as (
    select 1234 emp_number, to_date('19-JAN-09 07.06.00 AM', 'dd-MON-yy hh.mi.ss AM') TIME_IN_OUT, 'IN' SPECIFIER from dual union all 
    select 1234 emp_number, to_date('19-JAN-09 08:40:53 AM', 'dd-MON-yy hh.mi.ss AM') TIME_IN_OUT, 'OUT' SPECIFIER from dual union all 
    select 1234 emp_number, to_date('19-JAN-09 08:50:40 AM', 'dd-MON-yy hh.mi.ss AM') TIME_IN_OUT, 'IN' SPECIFIER from dual union all 
    select 1234 emp_number, to_date('19-JAN-09 09:50:32 AM', 'dd-MON-yy hh.mi.ss AM') TIME_IN_OUT, 'OUT' SPECIFIER from dual union all 
    select 1234 emp_number, to_date('19-JAN-09 10:07:18 AM', 'dd-MON-yy hh.mi.ss AM') TIME_IN_OUT, 'IN' SPECIFIER from dual union all 
    select 1234 emp_number, to_date('19-JAN-09 02:49:07 PM', 'dd-MON-yy hh.mi.ss AM') TIME_IN_OUT, 'OUT' SPECIFIER from dual union all 
    select 1234 emp_number, to_date('22-JAN-09 10:42:50 PM', 'dd-MON-yy hh.mi.ss AM') TIME_IN_OUT, 'IN' SPECIFIER from dual union all 
    select 1234 emp_number, to_date('23-JAN-09 06:50:40 AM', 'dd-MON-yy hh.mi.ss AM') TIME_IN_OUT, 'OUT' SPECIFIER from dual union all 
    select 1234 emp_number, to_date('23-JAN-09 10:49:55 PM', 'dd-MON-yy hh.mi.ss AM') TIME_IN_OUT, 'IN' SPECIFIER from dual union all 
    select 1234 emp_number, to_date('24-JAN-09 05:22:19 AM', 'dd-MON-yy hh.mi.ss AM') TIME_IN_OUT, 'OUT' SPECIFIER from dual union all 
    select 1234 emp_number, to_date('24-JAN-09 05:30:46 AM', 'dd-MON-yy hh.mi.ss AM') TIME_IN_OUT, 'IN' SPECIFIER from dual union all 
    select 1234 emp_number, to_date('24-JAN-09 05:43:51 AM', 'dd-MON-yy hh.mi.ss AM') TIME_IN_OUT, 'OUT' SPECIFIER from dual union all 
    select 1234 emp_number, to_date('24-JAN-09 05:48:40 AM', 'dd-MON-yy hh.mi.ss AM') TIME_IN_OUT, 'IN' SPECIFIER from dual union all 
    select 1234 emp_number, to_date('24-JAN-09 05:50:52 AM', 'dd-MON-yy hh.mi.ss AM') TIME_IN_OUT, 'OUT' SPECIFIER from dual union all 
    select 1234 emp_number, to_date('24-JAN-09 06:03:02 AM', 'dd-MON-yy hh.mi.ss AM') TIME_IN_OUT, 'IN' SPECIFIER from dual union all 
    select 1234 emp_number, to_date('24-JAN-09 06:43:44 AM', 'dd-MON-yy hh.mi.ss AM') TIME_IN_OUT, 'OUT' SPECIFIER from dual 
    )` 

記錄如果你看一下在22-JAN-09的數據,我們的In_Time在22-JAN-09 10.42.50 PM和第二天OUT_TIME於2009年1月23日06.50.40 AM,同一天 在2009年1月23日10.49.55 PM和OUT_TIME於24-JAN-09 05:22:19 AM有IN_TIME。因此,理想的輸出應爲

EMP_NUMBER DAY    TIME_IN           TIME_OUT 
` 
1234   19/Jun/11   19-JAN-09 10.07.18 AM    19-JAN-09 10.50.32 AM 
1234   22/Jun/11   22-JAN-09 10.42.50 PM     NIL 
1234   23/Jun/11     NIL       23-JAN-09 06.50.40 AM 
1234   24/Jun/11   23-JAN-09 10.49.55 PM     NIL 
1234   24/Jun/11     NIL      24-JAN-09 05:22:19 AM 
` 

我怎樣才能derired輸出,如果有一個以上的單日顯示的所有clockings?

+0

嗯...在'19-JAN-09 10.07.18 AM'和'19-JAN-09 09.50.32 AM'出現的時間怎麼樣? – Magnus

+0

@Magnus我糾正了所需的輸出 – ponicpool

+0

@ponicpool仍然顯示像@Magnus告訴你改變... :) –

回答

1

一個簡單的蠻力解決辦法是:

SELECT a.emp_number, a.time_in_out as time_in, (SELECT 
    MIN(b.time_in_out) 
    FROM yourtable b 
    WHERE b.specifier='OUT' 
    AND b.emp_number=a.emp_number 
    AND b.time_in_out>=a.time_in_out) as time_out 
FROM yourtable a 
WHERE a.specifier='IN' 
ORDER BY a.time_in_out; 

但是,如果你想拿起天沒有進/出記錄你需要做一個外連接到日期的完整表格,或使用PL/SQL遍歷一個序列。

+0

上述查詢將提供所有日期。但是如果第二天輸出時鐘,那麼該行的clock_out應該爲空,並且下一行的clock_in應該爲空,並且clock_out應該具有值。 – ponicpool

+0

然後相應地更改查詢? (和TRUNC(b.time_in_out)= TRUNC(a.time_in_out))並添加一個聯合反向 – symcbean

+0

你可以建議這個sql,因爲我無法做到這一點。對不起,我的無知。 – ponicpool

0

嘗試此基礎上@symcbean答案 - 這下面的查詢會給你所需的輸出.. 請讓我還是知道,如果您有任何疑問需要任何澄清((添加您的評論))

SELECT * FROM 
     (
     SELECT emp_number, 
       to_char(time_out ,'DD-MM-YYYY') day, 
       decode(to_char(time_in ,'DD-MM-YYYY'), 
         to_char(time_out ,'DD-MM-YYYY'), 
         min(time_in), 
         null 
         ) time_in, 
       max(time_out) time_out 
     FROM (
       SELECT a.emp_number, 
       a.time_in_out as time_in, 
       (
        SELECT MIN(b.time_in_out) 
        FROM t b 
        WHERE b.specifier = 'OUT' 
        AND b.emp_number = a.emp_number 
        AND b.time_in_out >= a.time_in_out 
       ) as time_out 
       FROM t a 
       WHERE a.specifier = 'IN' 
       ) 
       group by to_char(time_in ,'DD-MM-YYYY'),to_char(time_out ,'DD-MM-YYYY'),emp_number 
      union all 
      SELECT emp_number,to_char(time_out ,'DD-MM-YYYY'), 
        max(time_in), 
        null time_out 
      FROM (
        SELECT a.emp_number, 
         a.time_in_out as time_in, 
         (
          SELECT MIN(b.time_in_out) 
          FROM t b 
          WHERE b.specifier = 'OUT' 
          AND b.emp_number = a.emp_number 
          AND b.time_in_out >= a.time_in_out 
         ) as time_out 
          FROM t a 
          WHERE a.specifier = 'IN' 
        ) 
        group by to_char(time_in ,'DD-MM-YYYY'),to_char(time_out ,'DD-MM-YYYY'),emp_number 
    HAVING to_char(time_in ,'DD-MM-YYYY')<> to_char(time_out ,'DD-MM-YYYY') 
    ) 
    ORDER BY nvl(TIME_IN,time_out)