2013-10-01 17 views
1

我在Stackoverflow上看到了一些關於比較行的問題,但沒有什麼比較像這個問題。我有類似的表:使用基於列的唯一組合的Oracle SQL比較同一表中的行

- Month  (Date (01-Jan-2013) 
- Country  (Varchar2) 
- SubCustomer (Varchar2) 
- FTE   (Number) Represents a value that is manually entered by employees each month 

我們可能有一些數據,比如這個..

- 01-Jan-2013 USA Customer1 10 
- 01-Feb-2013 USA Customer1 15 
- 01-Mar-2013 USA Customer1 30 
- 01-Jan-2013 BRA Customer2 100 
- 01-Feb-2013 BRA Customer2 300 
- 01-Mar-2013 BRA Customer2 50 

我的目標是比較被輸入的FTE並提供警報在一個單獨的如果輸入的FTE爲每個月+國家+子客戶的前一個月的+/- 2倍,則爲「高度提示」或「低提示」或「確定」。我一直在玩不同的Case語句,但似乎無法逐月比較。

使用上述數據,客戶1將產生從二月「高度警惕」警報Mar和客戶2會產生揚的HGH警惕二月和月低警報日至3月

+0

你是否試圖在觸發器中實現這一點? 或者你只是想通過select語句檢索Month,Country,Customer,AlertType? –

回答

0

試試這個:NULL的可能性包或零

WITH TABLEDATA 
    AS (SELECT 
      TO_DATE ('01-Jan-2013', 
        'DD-MON-YYYY') 
       AS MONT, 
      'USA' AS COUNTRY, 
      'Customer1' AS SUBCUST, 
      0 AS FTE 
     FROM 
      DUAL 
     UNION ALL 
     SELECT 
      TO_DATE ('01-Feb-2013', 
        'DD-MON-YYYY') 
       AS MONT, 
      'USA' AS COUNTRY, 
      'Customer1' AS SUBCUST, 
      15 AS FTE 
     FROM 
      DUAL 
     UNION ALL 
     SELECT 
      TO_DATE ('01-Mar-2013', 
        'DD-MON-YYYY') 
       AS MONT, 
      'USA' AS COUNTRY, 
      'Customer1' AS SUBCUST, 
      30 AS FTE 
     FROM 
      DUAL 
     UNION ALL 
     SELECT 
      TO_DATE ('01-Jan-2013', 
        'DD-MON-YYYY') 
       AS MONT, 
      'BRA' AS COUNTRY, 
      'Customer2' AS SUBCUST, 
      100 AS FTE 
     FROM 
      DUAL 
     UNION ALL 
     SELECT 
      TO_DATE ('01-Feb-2013', 
        'DD-MON-YYYY') 
       AS MONT, 
      'BRA' AS COUNTRY, 
      'Customer2' AS SUBCUST, 
      300 AS FTE 
     FROM 
      DUAL 
     UNION ALL 
     SELECT 
      TO_DATE ('01-Mar-2013', 
        'DD-MON-YYYY') 
       AS MONT, 
      'BRA' AS COUNTRY, 
      'Customer2' AS SUBCUST, 
      50 AS FTE 
     FROM 
      DUAL) 
SELECT 
     MONT, 
     COUNTRY, 
     SUBCUST, 
     FTE, 
     ROUND ((FTE 
      - PREVIOUS_FTE) 
      /NULLIF (PREVIOUS_FTE, 
        0), 
      2) 
     * 100 
      CHANGE_IN_PERCENT, 
     CASE 
      WHEN ROUND ((FTE 
        - PREVIOUS_FTE) 
        /NULLIF (PREVIOUS_FTE, 
          0), 
        2) 
       * 100 >= 200 
      THEN 
       'High Alert' 
      WHEN ROUND ((FTE 
        - PREVIOUS_FTE) 
        /NULLIF (PREVIOUS_FTE, 
          0), 
        2) 
       * 100 <= 200 
      THEN 
       'Low Alert' 
      ELSE 
       'OK' 
     END 
      AS ALERTS 
FROM 
     (SELECT 
      MONT, 
      COUNTRY, 
      SUBCUST, 
      FTE, 
      LAG (FTE, 
       1) 
      OVER (PARTITION BY COUNTRY, SUBCUST ORDER BY MONT) 
       PREVIOUS_FTE 
     FROM 
      TABLEDATA); 

結果:

MONT  COUNTRY SUBCUST FTE CHANGE_IN_PERCENT ALERTS 
1/1/2013 BRA Customer2 100     OK 
2/1/2013 BRA Customer2 300 200    High Alert 
3/1/2013 BRA Customer2 50 -83    Low Alert 
1/1/2013 USA Customer1 0      OK 
2/1/2013 USA Customer1 15     OK 
3/1/2013 USA Customer1 30 100    Low Alert 
+0

因此,第二種解決方案的問題是我們有100多個客戶......我需要動態完成這些比較,而不是按照國家,客戶和月份列出。我想我可以讓第一個解決方案工作,但;)非常感謝您的幫助! – Ewaver

+0

第二部分實際上也很有幫助..謝謝! – Ewaver

+0

我剛剛使用with子句重新創建表。您可以使用表名而不是WITH子句。 – SriniV