我有以下表格包含:
1)合作者将开具发票的计划月费。
月:费用的月度能力
金额:与本月相关的费用金额
2)合作者收到的月度发票金额。
月:发票的月度能力
金额:与本月相关的发票金额
考虑这个例子:
表1(计划成本):
JAN-2013 10,000
FEB-2013 10,000
MAR-2013 10,000
APR-2013 10,000
MAY-2013 10,000
JUN-2013 10,000左
表2(实际发票):
MAR-2013 35,000
查询结果应为:
APR-2013 5,000
MAY-2013 10,000
JUN-2013 10,000左
任何提示?
由于 Wile E。
答案 0 :(得分:2)
根据您提供的信息,以下查询应生成您想要的结果。
SELECT TO_CHAR(month, 'MON-YYYY'),
DECODE(SIGN(planned_amount-(total_planned_amount-total_actual_amount)),
-1, planned_amount,
total_planned_amount-total_actual_amount) result
FROM (
SELECT month,
SUM(planned_amount) OVER (PARTITION BY month ORDER BY month) planned_amount,
SUM(planned_amount) OVER (ORDER BY month) total_planned_amount,
total_actual_amount
FROM (SELECT month,
planned_amount,
total_actual_amount
FROM (SELECT TRUNC(month, 'MM') month,
SUM(amount) planned_amount
FROM planned
GROUP BY TRUNC(month, 'MM')
),
(SELECT NVL(SUM(amount), 0) total_actual_amount
FROM actual
)
)
)
WHERE total_planned_amount - total_actual_amount > 0
ORDER BY month
内部查询使用笛卡尔联接创建每月的列表,以及该月的计划金额和所有发票的总和。
Month planned_amount total_actual_amount
Jan-2013 10000 35000
Feb-2013 10000 35000
Mar-2013 10000 35000
Apr-2013 10000 35000
May-2013 10000 35000
Jun-2013 10000 35000
然后执行另一个查询来计算计划金额的总计。
Month planned_amount total_planned_amount total_actual_amount
Jan-2013 10000 10000 35000
Feb-2013 10000 20000 35000
Mar-2013 10000 30000 35000
Apr-2013 10000 40000 35000
May-2013 10000 50000 35000
Jun-2013 10000 60000 35000
然后将结果限制为仅 total_planned_amount 大于 total_actual_amount 的结果,并且每个月返回较小 < i> planned_amount,或 total_planned_amount 与 total_actual_amount
之间的差异我希望这是有道理的。