Oracle SQL子查询如何使用查询A的结果来限制查询B
目标:Oracle SQL子查询如何使用查询A的结果来限制查询B,sql,oracle,subquery,Sql,Oracle,Subquery,目标: 合并我当前运行的两个查询 将查询1开始的一周作为查询2的筛选条件 查询1: ---------------------------------------------------- -- ************************************************ -- Accounts Recieveable (WEEKLY) snapshot -- ************************************************ -------
- 合并我当前运行的两个查询李>
- 将查询1开始的一周作为查询2的筛选条件
----------------------------------------------------
-- ************************************************
-- 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
包装在其周围,以允许分组。