2012-02-03 144 views
1

目標:的Oracle SQL子查詢如何使用結果的查詢限制查詢乙

  • 結合我目前運行兩個查詢。
  • 有從查詢1的一星期內的過濾標準的查詢2.

查詢1:

---------------------------------------------------- 
-- ************************************************ 
-- Accounts Recieveable (WEEKLY) snapshot 
-- ************************************************ 
---------------------------------------------------- 
SELECT 
    TRUNC(TX.ORIG_POST_DATE,'WW') AS WEEK, 
    SUM(TX.AMOUNT) AS OUTSTANDING 
FROM 
    TX 
WHERE 
    --Transaction types 
    (TX.DETAIL_TYPE = "Charges" OR 
    TX.DETAIL_TYPE = "Payments" OR 
    TX.DETAIL_TYPE = "Adjustments") 
GROUP BY 
    TRUNC(tx.ORIG_POST_DATE,'WW') 
ORDER BY 
    TRUNC(tx.ORIG_POST_DATE,'WW') 

輸出查詢1:

WEEK OUTSTANDING 
1/1/2012 18203.95 
1/8/2012 17605 
1/15/2012 19402.33 
1/22/2012 18693.45 
1/29/2012 19100 

查詢2:

---------------------------------------------------- 
-- ************************************************ 
-- Weekly Charge AVG over previous 13 weeks based on WEEK above 
-- ************************************************ 
---------------------------------------------------- 

SELECT 
    sum(tx.AMOUNT)/91 
FROM 
    TX 
WHERE 
    --Post date 
    TX.ORIG_POST_DATE <= WEEK AND 
    TX.ORIG_POST_DATE >= WEEK-91 AND 
    --Charges 
    (TX.DETAIL_TYPE = "Charge") 

輸出查詢2:

thirteen_Week_Avg 
1890.15626 

所需的輸出

WEEK  OUTSTANDING Thirteen_Week_Avg 
1/1/2012 18203.95 1890.15626 
1/8/2012 17605  1900.15626 
1/15/2012 19402.33 1888.65132 
1/22/2012 18693.45 1905.654 
1/29/2012 19100  1900.564 

注意Thirteen_Week_Avg先於 「WEEK」 字段13周。因此,隨着平均水平的提高,每週都會發生變化。

另外你們知道我可以閱讀哪些教程來更好地理解這種類型的問題?

+0

退房WITH子句:http://www.dba-oracle.com/t_with_clause.htm – kurosch 2012-02-03 22:03:22

+0

如果你有類似地雷問題上面我強烈建議你檢查出的Oracle分析功能本概述,可以是youtube在sheepsqueezers頻道,http://www.youtube.com/user/sheepsqueezersYT/search?query=analytic,或http://www.sheepsqueezers.com/上找到。 – Cimplicity 2012-02-09 14:38:30

回答

4

嘗試使用解析函數,例如:

select WEEK, sum(OUTSTANDING) as OUTSTANDING, THIRTEEN_WEEK_AVG 
    from (select trunc(TX.ORIG_POST_DATE, 'WW') as WEEK 
       ,AMOUNT as OUTSTANDING 
       ,avg(
        TX.AMOUNT) 
       over (order by trunc(TX.ORIG_POST_DATE, 'WW') 
         range numtodsinterval(7 * 13, 'day') preceding) 
        as THIRTEEN_WEEK_AVG 
      from TX 
      where (TX.DETAIL_TYPE = 'Charges' 
        or TX.DETAIL_TYPE = 'Payments' 
        or TX.DETAIL_TYPE = 'Adjustments')) 
group by WEEK, THIRTEEN_WEEK_AVG 
order by WEEK 

簡介解析函數可以發現hereNUMTODSINTERVAL如何工作是here

+0

因此,在實施您的解決方案後,它將列出發生的每項交易。所以我有多天用同一天的平均值重複。我試圖通過trunc(TX.ORIG_POST_DATE,'ww')拋出Group,但得到一個錯誤,它不是一個表達式的組。 – Cimplicity 2012-02-07 16:20:03

+1

我已經更新了代碼來包裝一個「選擇」,以允許分組。 – 2012-02-07 20:17:46

1

我的第一個想法是最好通過設置兩個遊標的存儲過程來處理,每個查詢一個遊標,每個遊標需要一個星期參數。您可以調用輸出星期的第一個遊標,然後執行此循環,然後每次都返回1周。然後將該周傳遞給十三週的平均遊標並讓其輸出平均金額。

如果你只是想在屏幕上使用dbms_output.put_line。如果你想把它寫到一個文件如csv那麼你需要設置一個文件處理器和所有相關的管道來創建/打開/寫入/保存一個文件。

O'reilly有一本很好的pl/sql書,可以很好地解釋procs和cursors。