2014-08-20 1 views
0

У меня есть 2 стола без каких-либо отношений между ними. Я хочу отображать данные в табличном формате по месяцам. Вот пример вывода:Две таблицы без прямой связи

enter image description here

Есть 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 

С уважением:

+0

Что случилось с присоединением к месяцу? У вас есть доход за каждый месяц, который имеет расходы и наоборот? –

+0

(1) в одном запросе мы не можем отобразить результат матрицы, (2) для результата матрицы. Я попробовал следующие объединения запросов, но мне нужны некоторые РАСЧЕТЫ, например: итоги и BBF (баланс широкий вперед) и текущий баланс. как определить долю дохода в общей сумме и расходной части. – Muhammad

+0

Рассмотрите возможность изменения заголовка на что-то вроде «Создание сводного отчета о доходах и расходах в Oracle Reports» и включите тег для финансирования. У людей с финансовым опытом, вероятно, будет хороший ответ, если вы сможете привлечь их внимание. –

ответ

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.

+0

Спасибо, позвольте мне попробовать. – Muhammad

1

SQLite> создать таблицу доходов (Month текст, total_income реальный);

sqlite> создать таблицу Расход (месяц текста, total_expense real);

sqlite> Вставить в Доходные значения ('Jan 2014', 9000);

sqlite> Вставить в Доходные значения ('Feb 2014', 6000);

sqlite> insert into Expense values ​​('Jan 2014', 9000);

sqlite> insert into Expense values ​​('Feb 2014', 18000);

SQLite> выберите Income.Month, Income.total_income, Expense.total_expense, Income.total_income - Expense.total_expense как Баланс от доходов, расходов, где Income.Month == Expense.Month

января 2014 | 9000,0 | 9000,0 | 0,0

февраля 2014 | 6000,0 | 18000,0 | -12000,0

+0

Спасибо, дорогой, пожалуйста, просмотрите изображение, о котором идет речь, мне нужен отчет MATRIX. – Muhammad