0

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

在此处输入图像描述

有2张不同的桌子

  • 1 收入
  • 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

问候:

4

2 回答 2

1

sqlite> create table Income(Month text, total_income real);

sqlite> create table Expense(Month text, total_expense real);

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

sqlite> 插入收入值('Feb 2014', 6000);

sqlite> 插入费用值('Jan 2014', 9000);

sqlite> 插入费用值('Feb 2014', 18000);

sqlite> 选择 Income.Month、Income.total_income、Expense.total_expense、Income.total_income - Expense.total_expense 作为收入的余额、费用 where Income.Month == Expense.Month

2014 年 1 月|9000.0|9000.0|0.0

2014 年 2 月|6000.0|18000.0|-12000.0

于 2014-08-20T03:58:23.913 回答
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() 从某个时间点到月初的所有更改。金融产品通常会在某个时间点存储余额,因为可能并非所有交易都被准确记录,需要有一个机制来调整余额。使用这个理论,您需要编写子查询来总结自上一个 Balance 以来的所有更改。

IMO 金融应用程序本质上是复杂的,因此解决方案需要一些时间才能形成正确的解决方案。

最后一句话:我不熟悉 OracleReports,但其中可能有一些东西可以帮助维护 BBF。

于 2014-08-20T06:41:18.927 回答