要收到的每月费用查询 - Oracle 11g

时间:2013-05-17 13:53:48

标签: oracle

在Oracle 11g数据库上的

我有以下表格包含:

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。

1 个答案:

答案 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

之间的差异

我希望这是有道理的。