2016-12-14 59 views
0

我正在查詢有關某些值的分組並將數據插入基於分組的不同表中。在Oracle中查找分組記錄

表名是DETAILS2。該表是這樣的:

NUM2 MAT_NUM  TRAVEL_DT  TRAVEL_TYP  TRAVEL_REQ 

1-7OR Rail  11-OCT-2016  Train   2 

1-7OR Ground  12-OCT-2016  Bus   2 

1-7OR Fly   15-0CT-2016  Flight   1 

1-72R Rail  11-SEP-2016  Train   2 

1-72R Ground  12-SEP-2016  Bus   3 

1-72R Fly   15-SEP-2016  Flight   1 

我需要通過NUM2,MAT_NUM第一組,然後由TRAVEL_REQ。

  1. 如果我發現MAT_NUM是Rail或Ground與TRAVEL_REQ相同,那麼我只需要在另一個表中插入一條記錄。
  2. 如果我發現MAT_NUM是鐵路或地面與不同的TRAVEL_REQ,那麼我需要插入兩個記錄到另一個表。
  3. 如果我發現MAT_NUM是Fly,那麼我只需要在另一個表中插入一條記錄。

爲了達到這個目的,我先寫了下面的代碼。但它插入所有記錄。你能幫我修改代碼嗎?

DECLARE 

    NUM1 VARCHAR2(50); 
    NXTNUM1 VARCHAR2(50); 
    DECIDER VARCHAR2(10); 
    TYP1 VARCHAR2(50); 

    CURSOR FET_TYP 
    IS 
    SELECT DISTINCT NUM2, 
      LEAD(NUM2) OVER (ORDER BY NUM2), 
      CASE WHEN DET.MAT_NUM NOT LIKE '%Fly%' THEN 0 ELSE 1 END DECIDER, 
      MAT_NUM 
    FROM DETAILS2 
    ORDER BY NUM2; 

    BEGIN 
    OPEN FET_TYP; 
    LOOP 

    FETCH FET_TYP 
    INTO NUM1, 
      NXTNUM1, 
      DECIDER, 
      TYP1; 

    EXIT WHEN FET_TYP%NOTFOUND; 

    IF ((NUM1 = NXTNUM1) AND (DECIDER = 0)) 
    THEN 

    INSERT INTO TEMP1 
    VALUES (NUM1, TYP1, 'Ground'); 

    ELSIF ((NUM1 = NXTNUM1) AND (DECIDER = 1)) 
    THEN 

    INSERT INTO TEMP1 
    VALUES (NUM1, TYP1, 'Flight'); 

    END IF; 

    END LOOP; 

    COMMIT; 

    CLOSE FET_TYP; 

    END; 

以下是最終輸出的樣子。

NUM2 MAT_NUM  TRAVEL_DT  TRAVEL_TYP  TRAVEL_REQ 

1-7OR Ground  12-OCT-2016  Bus   2 

1-7OR Fly   15-0CT-2016  Flight   1 

1-72R Rail  11-SEP-2016  Train   2 

1-72R Ground  12-SEP-2016  Bus   3 

1-72R Fly   15-SEP-2016  Flight   1 

這些都是與在寫入插入語句我會插入一些默認值沿着主列輸出。第一條記錄可以是鐵路或地面。 TRAVEL_REQ具有相同的值時無關緊要。

+0

這可能沒有遊標可行。你能在TEMP1中編輯你的文章和預期的結果嗎? – Anand

+2

在你的第一個條件(1.) - 應該插入哪條記錄?只說「只有一個」是不夠的,你必須說明哪一個。然後:在「其他表」中插入什麼 - 這個表中的行是否有相同的列?還是隻有一些列?或者完全不同的東西?另一個問題:條件(3.)是什麼意思?對於1-70R你有三種類型。其中之一是FLY。這是否意味着你只在三行中插入一行?如果是這樣,哪一個? (如果travel_req在另外兩行中不同 - 這將與條件2相矛盾。) – mathguy

+0

1.任何人都可以插入。 2.對於1-7OR,我插入2條記錄,因爲TRAVEL_REQ是相同的。對於1-72R,我插入3條記錄,因爲TRAVEL_REQ對於所有 –

回答

1

您可以簡單地根據您的條件使用row_number函數。

select num2,mat_num,travel_dt,travel_typ,travel_req 
from (select d.* 
     ,row_number() over(partition by num2,travel_req order by travel_req,mat_num) rn 
     from details2 d 
    ) x 
where rn = 1 

使用返回結果集insert所需的列到不同的表。

+0

不同,所以您好vkp,謝謝您的回答。我的一位同事也提出了這個問題。但是,如果我們使用這個,那麼MAT_NUM上的條件將被忽略,並且結果集對於'1-72R'記錄將是不同的,因爲我們只是通過NUM2進行分區而不是MAT_NUM –

+0

我做了一個UNION ALL,並且工作完美。非常感謝vkp! select select num2,mat_num,travel_dt,travel_typ,travel_req from(select d。* ,ROW_NUMBER()在從details2 d )(由NUM2分區,travel_req爲了通過travel_req,mat_num其中MAT_NUM不喜歡「%粉煤灰%)RN X 其中RN = 1 UNION ALL 選擇NUM2,mat_num,travel_dt ,travel_typ,travel_req 從(選擇d * ,ROW_NUMBER()以上(分區由NUM2,通過travel_req travel_req順序,mat_num其中LIKE「%粉煤灰%)RN 從details2 d mAT_NUM)× 其中RN = 1 –