Oracle SQL子查询如何使用查询A的结果来限制查询B

Oracle SQL子查询如何使用查询A的结果来限制查询B,sql,oracle,subquery,Sql,Oracle,Subquery,目标: 合并我当前运行的两个查询 将查询1开始的一周作为查询2的筛选条件 查询1: ---------------------------------------------------- -- ************************************************ -- Accounts Recieveable (WEEKLY) snapshot -- ************************************************ -------

目标:

  • 合并我当前运行的两个查询
  • 将查询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')
    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
thirteen_Week_Avg
1890.15626
输出查询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')
    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
thirteen_Week_Avg
1890.15626
查询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")
所需输出

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
注:十三周平均值比“周”字段早13周。因此,随着平均值窗口的向前移动,它每周都在变化


你们知道我可以阅读哪些教程来更好地理解这类问题的解决方案

我的第一个想法是,这最好由一个存储过程来处理,该存储过程设置两个游标,每个游标对应一个查询,每个游标接受一个week参数。您可以调用第一个输出本周和未完成的游标,并让此循环进行多次,每次向后移动1周。然后将该周传递给十三周平均值光标,并让其输出平均值金额

如果只想在屏幕上显示,可以使用dbms_output.put_line。如果要将其写入csv等文件,则需要设置filehandler和所有相关管道来创建/打开/写入/保存文件


O'reilly有一本非常好的pl/sql书籍,它很好地解释了过程和游标

我的第一个想法是,这最好由一个存储过程来处理,该存储过程设置两个游标,每个游标对应一个查询,每个游标接受一个week参数。您可以调用第一个输出本周和未完成的游标,并让此循环进行多次,每次向后移动1周。然后将该周传递给十三周平均值光标,并让其输出平均值金额

如果只想在屏幕上显示,可以使用dbms_output.put_line。如果要将其写入csv等文件,则需要设置filehandler和所有相关管道来创建/打开/写入/保存文件


O'reilly有一本非常好的pl/sql书籍,它很好地解释了过程和游标

尝试使用分析函数,例如:

  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

可以找到解析函数的介绍。以及
NUMTODSINTERVAL
的工作原理。

尝试使用以下分析函数:

  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

可以找到解析函数的介绍。以及
NUMTODSINTERVAL
的工作原理。

查看WITH子句:如果您有类似于我上面的问题,我强烈建议您查看这篇Oracle分析函数概述,可以在youtube上的Sheepsquezers频道上找到,或者。查看WITH子句:如果您有类似于我上面的问题,我强烈建议您查看这篇Oracle分析功能概述,可以在youtube的Sheepsquezers频道上找到。或者。因此,在实施您的解决方案后,它将列出发生的每个事务。因此,我有多天重复同一天的平均值。我尝试按trunc(TX.ORIG_POST_DATE,'ww')抛出Group,但得到一个错误,即它不是按表达式抛出的Group。我已更新代码,在其周围包装一个
select
,以允许分组。因此,在实现解决方案后,它将列出发生的每个事务。因此,我有多天重复同一天的平均值。我尝试按trunc(TX.ORIG_POST_DATE,'ww')抛出Group By,但得到一个错误,即它不是按表达式创建的Group By。我已更新代码,将
select
包装在其周围,以允许分组。