2016-07-12 23 views
0

我這是應該以下做一個嵌套查詢:的Oracle SQL - 基於結果從一個嵌套查詢和數據

  1. 底查詢該列中創建了一個名爲「倡議」欄和標誌記錄基礎在「BU_ID」上。
  2. 然後SUBQRY,使用LAG函數來檢查是否有記錄來5年回來。這是基於「CUSTID」和「INITIATIVE」(在步驟1中定義的)。
  3. 最後,頂部查詢創建列名爲「TRANSACTION_FLAG」,這將標誌記錄「新建」或「現有」。查詢在60個月之前檢查是否有任何交易。

請參考下面的查詢:

SELECT 
"REGION" 
, "COUNTRY" 
, "CUSTID" 
, "CUSTOMER" 
, "VERTICAL" 
, "DATE_YEARMONTH" 
, "DATE_YEAR" 
, "ORDER_VALUE" 
, "INITIATIVE" 
, MAX(CASE WHEN TO_DATE("PREV_FYM_INITIATIVE",'YYYYMM') >= ADD_MONTHS (TO_DATE("DATE_YEARMONTH",'YYYYMM'), -60) THEN 'Existing' ELSE 'New' END) "TRANSACTION_FLAG" 
FROM 
(
SELECT 
SUBQRY."REGION" 
, SUBQRY."COUNTRY" 
, SUBQRY."CUSTID" 
, SUBQRY."CUSTOMER" 
, SUBQRY."VERTICAL" 
, SUBQRY."DATE_YEARMONTH" 
, SUBQRY."DATE_YEAR" 
, SUBQRY."ORDER_VALUE" 
, SUBQRY."INITIATIVE" 
, LAG (SUBQRY."DATE_YEARMONTH", 1) OVER (PARTITION BY SUBQRY."CUSTID", SUBQRY."INITIATIVE" ORDER BY "DATE_YEARMONTH" ASC) "PREV_FYM_INITIATIVE" 
FROM 
(
SELECT 
     T1."REGION" 
     , T1."COUNTRY" 
     , T1."CUSTID" 
     , T1."CUSTOMER" 
     , T1."VERTICAL" 
     , T3."DATE_YEARMONTH" 
     , T3."DATE_YEAR" 
     , T4."ORDER_VALUE" 
     , T3."DATE_DESC" 
     , (CASE 
        WHEN T2."BU_ID" IN ('ACC', 'LXC', 'OTP') THEN 'Process' 
        ELSE 'NOT Process' END) "INITIATIVE" 
     FROM 
     "LIBRARY"."FACTSALES" T4 
     , "LIBRARY"."CUSTOMER_TBL" T1 
     , "LIBRARY"."PRODUCT_TBL" T2 
     , "LIBRARY"."TIME_TBL" T3 
     WHERE 
     T4."CUSTOMER_KEY" = T1."CUSTOMER_KEY" 
     AND T4."PRODUCT_KEY" = T2."PRODUCT_KEY" 
     AND T4."DATE_KEY" = T3."DATE_KEY" 
     AND T1."COUNTRY" IN ('Austria', 'Germany', 'France') 
     AND T3."DATE_YEAR" BETWEEN '2012'AND '2016' 
     AND T4."ORDER_VALUE" > 0 
     GROUP BY 
     T1."REGION" 
     , T1."COUNTRY" 
     , T1."CUSTID" 
     , T1."CUSTOMER" 
     , T1."VERTICAL" 
     , T3."DATE_YEARMONTH" 
     , T3."DATE_YEAR" 
     , T4."ORDER_VALUE" 
     , T3."DATE_DESC" 
     , T2."BU_ID" 
) SUBQRY) 
WHERE "INITIATIVE" LIKE 'Process' 
GROUP BY 
"REGION" 
, "COUNTRY" 
, "CUSTID" 
, "CUSTOMER" 
, "VERTICAL" 
, "DATE_YEARMONTH" 
, "DATE_YEAR" 
, "ORDER_VALUE" 
, "INITIATIVE"; 

可以說,我得到以下結果對單一客戶的例子:

REGION  COUNTRY CUSTID  CUSTOMER   VERTICAL  DATE_YEARMONTH  DATE_YEAR ORDER_VALUE  INITIATIVE  TRANSACTION_FLAG 
1. North   Germany 25166  Abraxo Cleaner Chemicals  201201    2012  25.50    Process  New 
2. North   Germany 25166  Abraxo Cleaner Chemicals  201201    2012  45.50    Process  Existing 
3. North   Germany 25166  Abraxo Cleaner Chemicals  201405    2014  73.49    Process  Existing 
4. North   Germany 25166  Abraxo Cleaner Chemicals  201507    2015  156.29    Process  Existing 
5. North   Germany  25166  Abraxo Cleaner Chemicals  201511    2015  376.22    Process  Existing 

正如你可以看到線沒有。 1被標記爲「新」。所有其他行被標記爲「現有」,因爲它們在第一行之後的數據庫中被預訂。但是,行號。 2日當天預訂。

我需要實現的是要總結線標記「新」與它們現有的「,但屬於同一DATE_YEARMONTH線。所以回到上面的5行。我需要總結線路號碼。 1和2.總價值71. 或者,也許有一種簡單的方法來標記這樣的記錄,而不是將它們概括起來?當我下載查詢結果時,這將允許我在excel中輕鬆地進行求和。

p.s. 如果這有什麼用處,使用的查詢來自我以前的帖子:Oracle SQL- Flag records based on record's date vs history

+0

當你說他們 - 你的意思是把它們合併成一行,所以整個輸出只能是4行?這是否僅在第一個月發生?例如,如果您在同一個月的2015年獲得兩個訂單項,那麼它們不會相加? –

+0

@ Peter M.我不介意只有4行的結果。其實,這可能會更好。我需要檢查兩件事情: 1st)計算新交易的數量;這就是這個查詢最初構建的內容。目標不是將第1行和第2行計爲2筆新交易。 2)稍後我被要求總結新交易的價值。因此,總結第1行和第2行只顯示71行的值將會很好。當然,可能有多條線路,不僅有兩條線路可以符合標準。 – Blase

+0

你需要學習縮進,這是不可讀的。 – Hogan

回答

0

更改底部查詢類似下面。

您將需要修復的其他查詢我的名字ORDER_VALUE的變化ORDER_VALUE_TOTAL。如果您想查看,還可以在其他查​​詢中引入ORDER_COUNT。希望這一點很容易理解。

SELECT 
    T1."REGION" 
    , T1."COUNTRY" 
    , T1."CUSTID" 
    , T1."CUSTOMER" 
    , T1."VERTICAL" 
    , T3."DATE_YEAR" 
    , T3."DATE_YEARMONTH" 
    , T3."DATE_DESC" 
    , (CASE 
       WHEN T2."BU_ID" IN ('ACC', 'LXC', 'OTP') THEN 'Process' 
       ELSE 'NOT Process' END) "INITIATIVE" 
    , SUM(T4."ORDER_VALUE") "ORDER_VALUE_TOTAL" 
    , COUNT(*) "ORDER_COUNT" 
    FROM 
    "LIBRARY"."FACTSALES" T4 
    , "LIBRARY"."CUSTOMER_TBL" T1 
    , "LIBRARY"."PRODUCT_TBL" T2 
    , "LIBRARY"."TIME_TBL" T3 
    WHERE 
    T4."CUSTOMER_KEY" = T1."CUSTOMER_KEY" 
    AND T4."PRODUCT_KEY" = T2."PRODUCT_KEY" 
    AND T4."DATE_KEY" = T3."DATE_KEY" 
    AND T1."COUNTRY" IN ('Austria', 'Germany', 'France') 
    AND T3."DATE_YEAR" BETWEEN '2012'AND '2016' 
    AND T4."ORDER_VALUE" > 0 
    GROUP BY 
    T1."REGION" 
    , T1."COUNTRY" 
    , T1."CUSTID" 
    , T1."CUSTOMER" 
    , T1."VERTICAL" 
    , T3."DATE_YEAR" 
    , T3."DATE_YEARMONTH" 
    , T3."DATE_DESC" 
    , (CASE 
      WHEN T2."BU_ID" IN ('ACC', 'LXC', 'OTP') THEN 'Process' 
      ELSE 'NOT Process' END) 
+0

這解決了我的問題。謝謝。 – Blase