2012-02-03 141 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。