两张表没有直接关系

时间:2014-08-20 03:49:33

标签: sql oracle oraclereports

我有2张表,它们之间没有关系。我希望按月以表格格式显示数据。这是一个示例输出:

enter image description here

有2个不同的表

  • 1 for income
  • 1表示费用

问题是我们之间没有直接关系。它们之间唯一的共同点是月(日期)。有没有人建议如何生成这样的报告?

这是我的工会查询:

    SELECT TO_DATE(TO_CHAR(PAY_DATE,'MON-YYYY'), 'MON-YYYY') , 'FEE RECEIPT',     NVL(SUM(SFP.AMOUNT_PAID),0) AMT_RECIEVED
FROM STU_FEE_PAYMENT SFP, STU_CLASS SC, CLASS C
WHERE SC.CLASS_ID = C.CLASS_ID
AND SFP.STUDENT_NO = SC.STUDENT_NO
AND PAY_DATE BETWEEN '01-JAN-2014' AND '31-DEC-2014' 
AND SFP.AMOUNT_PAID >0
GROUP BY  TO_CHAR(PAY_DATE,'MON-YYYY')
UNION 
SELECT TO_DATE(TO_CHAR(EXP_DATE,'MON-YYYY'), 'MON-YYYY') , ET.DESCRIPTION,  SUM(EXP_AMOUNT)
FROM EXP_DETAIL ED, EXP_TYPE ET, EXP_TYPE_DETAIL ETD
WHERE ET.EXP_ID = ETD.EXP_ID
AND ED.EXP_ID = ET.EXP_ID
AND ED.EXP_DETAIL_ID = ETD.EXP_DETAIL_ID
AND EXP_DATE BETWEEN '01-JAN-2014' AND '31-DEC-2014' 
GROUP BY TO_CHAR(EXP_DATE,'MON-YYYY'), ET.DESCRIPTION
ORDER BY 1

问候:

2 个答案:

答案 0 :(得分:1)

源码>创建表收入(月份文本,total_income real);

源码> create table Expense(月文本,total_expense real);

源码>插入收入值('2014年1月',9000);

源码>插入收入值('2014年2月',6000);

源码>插入费用值('2014年1月',9000);

源码>插入费用值('2014年2月',18000);

源码>选择Income.Month,Income.total_income,Expense.total_expense,Income.total_income - Expense.total_expense作为收入余额,费用,其中Income.Month == Expense.Month

2014年1月| 9000.0 | 9000.0 | 0.0

2014年2月| 6000.0 | 18000.0 | -12000.0

答案 1 :(得分:1)

为了做到这一点,您可能希望将收入和费用分成不同的子查询。

我已经将你的联合查询的两部分分开并将它们分成子查询,一个叫做收入,一个叫做费用。两个子查询都像以前一样汇总了月份期间的数据,但现在您可以在月份上使用JOIN来允许连接每个子查询的数据。注意:我使用了OUTER JOIN,因为这仍然会在没有收入的月份加入,但是有费用,反之亦然。这将需要一些操作,因为如果没有事务发生,你可能最好在一个月内返回一组零。

在顶级SELECT中,将*的使用替换为所需字段的正确列表。我只是用它来表明每个字段都可以从外部查询中的子查询中重用,方法是将别名称为表名。

SELECT Income.*, Expenses.*
FROM  (SELECT TO_DATE(TO_CHAR(PAY_DATE,'MON-YYYY'), 'MON-YYYY') as Month, 'FEE RECEIPT', NVL(SUM(SFP.AMOUNT_PAID),0) AMT_RECIEVED
       FROM STU_FEE_PAYMENT SFP, STU_CLASS SC, CLASS C
       WHERE SC.CLASS_ID = C.CLASS_ID
       AND SFP.STUDENT_NO = SC.STUDENT_NO
       AND PAY_DATE BETWEEN '01-JAN-2014' AND '31-DEC-2014' 
       AND SFP.AMOUNT_PAID >0
       GROUP BY  TO_CHAR(PAY_DATE,'MON-YYYY') Income
OUTER JOIN (SELECT TO_DATE(TO_CHAR(EXP_DATE,'MON-YYYY'), 'MON-YYYY') as Month, ET.DESCRIPTION,  SUM(EXP_AMOUNT)
            FROM EXP_DETAIL ED, EXP_TYPE ET, EXP_TYPE_DETAIL ETD
            WHERE ET.EXP_ID = ETD.EXP_ID
            AND ED.EXP_ID = ET.EXP_ID
            AND ED.EXP_DETAIL_ID = ETD.EXP_DETAIL_ID
            AND EXP_DATE BETWEEN '01-JAN-2014' AND '31-DEC-2014' 
            GROUP BY TO_CHAR(EXP_DATE,'MON-YYYY'), ET.DESCRIPTION) Expenses
ON Income.Month = Expenses.Month

为了获得最终结果,您还需要插入许多计算,这些计算必须单独进行。执行上述期望的结果查询可能会比这更长,我只是想向您展示结构。

然而,最后一个棘手的部分将是BBF。买入均衡。 SQL非常适合连接表和列,但每行都是单独处理和处理的,它不会从查询中的上一行读取和赋值,并允许您在下一行中操作该值。要做到这一点,你需要另一个子查询来SUM()从一个时间点到月初的所有变化。金融产品通常在时间点存储余额,因为可能并非所有交易都被准确记录,并且需要有一种机制来调整余额。使用此理论,您需要编写子查询以汇总自上一次余额以来的所有更改。

IMO财务应用程序本质上很复杂,因此解决方案需要一些时间来塑造正确的应用程序。

最后一句话:我对OracleReports并不熟悉,但可能会有一些内容可以帮助维护BBF。

相关问题