2017-01-26 4 views
0

У меня есть следующий запрос:Суммируя сумму из двух отдельных таблиц

select tb1.accountnum, to_char(tb3.month, 'MON, YYYY'), 
      sum(tb3.amt_due) 
from  db_table1 tb1, db_table2 tb2, db_table3 tb3 
where  tb1.acctnum = tb2.acctnum and 
      tb2.acctcode = tb3.acctcode and 
      tb3.type_id = 10   and 
      tb1.status = 'YES' 
group by tb1.accountnum, (tb3.month, 'MON, YYYY'), 
having sum(tb3.amt_due) < 0; 

Этот запрос будет суммировать суммы долга за каждый месяц отдельно, и если отрицательный, вернуть номер счета. Например:

accountnum | Month | Amt_Due 
---------- | --------- | --------- 
     1 | Jan | 15 
---------- | --------- | --------- 
     1 | Jan | -20 
---------- | --------- | --------- 
     1 | Mar |  3 
---------- | --------- | --------- 
     2 | Aug | 13 
---------- | --------- | --------- 
     2 | Dec | -25 
---------- | --------- | --------- 
     2 | Dec | 40 
---------- | --------- | --------- 

Даст результат:

accountnum | Month | Amt_Due 
---------- | --------- | --------- 
     1 | Jan | -5 
---------- | --------- | --------- 

теперь я хочу, чтобы добавить дополнительную таблицу (Tb4) и просуммировать расходы, как мы только что делали выше. Рассмотрим эти строки в новой таблице (tb4).

accountnum | Month | misc_charge 
---------- | --------- | --------- 
     1 | Jan | -45 
---------- | --------- | --------- 
     1 | Jan |  25 
---------- | --------- | --------- 
     2 | Sep |  -7 
---------- | --------- | --------- 

Суммируя обвинения даст нам результат:

accountnum | Month | misc_charge 
---------- | --------- | --------- 
     1 | Jan | -20 
---------- | --------- | --------- 
     2 | Sep |  -7 
---------- | --------- | --------- 

Теперь я хочу подвести итоги нашего первого запроса к результатам второго. Итак:

accountnum | Month | Amt_Due 
---------- | --------- | --------- 
     1 | Jan | -5 
---------- | --------- | --------- 

суммируется с

accountnum | Month | misc_charge 
---------- | --------- | --------- 
     1 | Jan | -20 
---------- | --------- | --------- 
     2 | Sep |  -7 
---------- | --------- | --------- 

дает окончательный результат:

accountnum | Month | sum(sum(tb3.amt_due) + sum(tb4.misc_charge)) 
---------- | --------- | --------- 
     1 | Jan | -25 
---------- | --------- | --------- 
     2 | Sep |  -7 
---------- | --------- | --------- 

Я изменил свой первоначальный запрос, чтобы включить Tb4, но Oracle дает мне ошибку: ORA -00935: групповая функция находится слишком глубоко

select tb1.accountnum, to_char(tb3.month, 'MON, YYYY'), 
      to_char(tb4.month, 'MON, YYY'), 
      sum(sum(tb3.amt_due) + sum(tb4.misc_charge)) 
from  db_table1 tb1, db_table2 tb2, db_table3 tb3, db_table4 tb4 
where  tb1.acctnum = tb2.acctnum and 
      tb2.acctcode = tb3.acctcode and 
      tb3.acctcode = tb4.acctcode and 
      tb3.type_id = 10   and 
      tb1.status = 'YES' 
group by tb1.accountnum, to_char(tb3.month, 'MON, YYYY'), 
      to_char(tb4.month, 'MON, YYY') 
having sum(sum(tb3.amt_due) + sum(tb4.misc_charge)) < 0; 

Может кто-нибудь, пожалуйста, помогите мне с синтаксисом включения финального стола?

Спасибо!

+0

Почему бы не поделиться тем, что вы пробовали? – BobC

+0

Добавлены изменения, которые я пробовал! – ComputersAreNeat

+0

Я не могу выполнить весь процесс (слишком поздно в день), но: если вы группируете по счету и месяцу и выбираете сумму сумм отдельно в двух наборах строк (будь то базовые таблицы, представления, подзапросы, результат объединений и т. д.) - почему вы не можете сделать UNION ALL из наборов строк, * только соответствующие столбцы *, ПЕРЕД каждой группой по и суммой, а THEN применить функцию группировки и агрегации к результату UNION ALL? Это было бы чище (проще писать и следить за будущими разработчиками, поддерживая код) и более эффективно. – mathguy

ответ

1

Я думаю, вам нужно будет что-то вроде этого. Я не тестировал его с вашими данными/таблицами, поэтому посмотрите, работает ли это.

select accountnum, month, sum(amt)               
from                       
(                       
    select tb1.accountnum, to_char(tb3.month, 'MON, YYYY') month,       
      sum(tb3.amt_due) amt                
    from  db_table1 tb1, db_table2 tb2, db_table3 tb3          
    where  tb1.acctnum = tb2.acctnum and             
      tb2.acctcode = tb3.acctcode and             
      tb3.type_id = 10   and             
      tb1.status = 'YES'                
    group by tb1.accountnum, (tb3.month, 'MON, YYYY')           
    union all                     
    select tb4.accountnum, to_char(tb4.month, 'MON, YYYY'),          
      sum(tb4.misc_charge)                
    from tb4 
    group by tb4.accountnum, to_char(tb4.month, 'MON, YYYY')                     
)                        
group by accountnum, month                 
having sum(amt) < 0  
Смежные вопросы