2015-11-19 2 views
2

Я хочу применить группу По условию для моего SQL ниже, чтобы O/P отобразил POL # с GP.Группа По синтаксису при использовании Cross Join

select t.POl#, (DEB.CUSTD - CRED.CUSTC) AS GP 
from (
     (
      select POL.SP_NUM POL# 
      ,  sum(D.AMT) AS CUSTD 
      from S_INVOICE D 
      ,  S_ASSET POL 
      where POL.ROW_ID   = D.FN_ACCNT_ID 
      and POL.SP_NUM   in ('000','111','222') 
      and D.DEBIT_TYPE   = 'Customer' 
      group by POL.SP_NUM 
     ) DEB 
     CROSS JOIN 
     (
      select pol.SP_NUM POL# 
      ,  sum(C.AMT) AS CUSTC 
      from S_SRC_PAYMENT C 
      ,  S_ASSET POL 
      where POL.ROW_ID   = C.ASSET_ID 
      and POL.SP_NUM   in ('000','111','222') 
      and C.CG_DEDN_TYPE_CD = 'Customer' 
      group by POL.SP_NUM 
     ) CRED 
    ) t 
    group by t.POL# 

Когда я исполняю то же я получаю «ORA-00933: команды SQL не должным образом закончилась» ошибка, когда курсор указывает на «т»

Просьба помочь.

Expected O/P: 
POL# GP 
000  800 
111  120 
222  50 

Прикрепление образца данных с объяснением для лучшего понимания требований:

Таблица 1:

S_ASSET 
ROW_ID POL# 
1   000 
2   111 
3   222 
4   333 
5   444 

Таблица 2:

S_INVOICE (Debit Table) 
FN_ACCNT_ID POL# DEBIT_TYPE   AMT 
1    000  Customer   10 
1    000  Customer   10 
1    000  Insurer    5 
2    111  Customer   10 
3    222  Customer   10 
3    222  Insurer    5 
5    444  Insurer    10 

Таблица 3:

S_SRC_PAYMENT (Credit Table) 
ASSET_ID POL# CG_DEDN_TYPE_CD  AMT 
1   000  Insurer    10 
1   000  Insurer    10 
1   000  Customer   5 
2   111  Insurer    10 
3   222  Insurer    5 
3   222  Insurer    5 
3   222  Customer   5 
5   444  Customer   10 

В соответствии с этим запросом я буду рассматривать записи «Customer» для POL # и SUM AMT. (Каждый дебет для клиента зачисляет Страховщик (ы) в POL # & наоборот)

Ожидаемого O/P (Сумма дебета - Сумма кредитов) для заказчика на POL #

POL #  AMT (GP) 
000   15 
111   10 
222   5 
333   0 
444  -10 
+0

Что является уникальным ключом S_ASSET? Вы используете столбцы SP_NUM и ROW_ID. Является ли один из них однозначно идентифицировать запись в таблице? Может, даже оба? Или, может быть, просто сочетание этих двух? –

+0

уникальным ключом для S_ASSET будет ROW_ID, но для GROUPING SAKE SP_NUM будет считаться, что это будет дублироваться. –

ответ

1

Вы, очевидно, хотите получить deb и cred per s_asset, а затем агрегировать, чтобы получить суммы. Вы можете сделать это без объединения и подзапрос суммы непосредственно вместо:

select 
    sp_num as pol#, 
    sum(<get deb sum for the pol.row_id here>) - sum(<get cred sum for the pol.row_id here>) 
from s_asset pol 
where sp_num in ('000','111','222') 
group by sp_num; 

Полный запрос:

select 
    sp_num as pol#, 
    coalesce(sum(
    (
     select sum(deb.amt) 
     from s_invoice deb 
     where deb.fn_accnt_id = pol.row_id 
     and deb.debit_type = 'Customer' 
    ) 
), 0) - 
    coalesce(sum(
    (
     select sum(cred.amt) 
     from s_src_payment cred 
     where cred.asset_id = pol.row_id 
     and cred.cg_dedn_type_cd = 'Customer' 
    ), 0) 
) as gp 
from s_asset pol 
where sp_num in ('000','111','222') 
group by sp_num; 

То же самое с соединениями вместо:

select 
    pol.sp_num as pol#, 
    coalesce(sum(deb.total), 0) - coalesce(sum(cred.total), 0) as gp 
from s_asset pol 
left join 
(
    select fn_accnt_id as pol_row_id, sum(deb.amt) as total 
    from s_invoice 
    where debit_type = 'Customer' 
    group by fn_accnt_id 
) deb on deb.pol_row_id = pol.row_id 
left join 
(
    select asset_id as pol_row_id, sum(amt) as total 
    from s_src_payment 
    where cg_dedn_type_cd = 'Customer' 
    group by asset_id 
) cred on cred.pol_row_id = pol.row_id 
group by pol.sp_num; 
+0

wow !! ... мне потребуются следующие несколько часов, чтобы полностью изучить и понять написанный вами запрос. Спасибо большое.Я буду выполнять то же самое с полными столбцами, а затем пометить ваш ответ как правильный/принятый. –

+0

umm ... когда нет записей в таблице Credit &/или Debit для каждого POL, результат неправильный. Количество записей верно, но GP повторяет предыдущее значение, где в нем должно быть значение null/0 ... –

+0

Это странно. Когда нет кредитной и/или дебетовой записи, тогда сумма равна нулю. COALESCE изменяет значение null на ноль. Я не вижу, чтобы значение повторялось. Вы знаете sqlfiddle.com? Там вы можете настроить таблицы с образцами данных. Попробуйте найти образцы данных, которые приводят к нежелательному результату, и дайте нам ссылку sqlfiddle для проверки и проверки. –

0

Этот синтаксис

from ((select ...) CROSS JOIN (select ...)) 

недействителен. JOIN принадлежит FROM. Так что любой из них было бы правильно:

from (SELECT * FROM (select ...) CROSS JOIN (select ...)) 

или

from (select ...) CROSS JOIN (select ...) 

Однако, вы уверены, что вы хотите CROSS JOIN вообще? Оба подзапроса дают вам номера POL плюс данные, летучая мышь, а не присоединяют их к POL #, вы пересекаете результаты, поэтому вы получаете все комбинации POL #.

+0

Да Торстен, вы правы. Когда я тестировал запрос более чем одной записи, он терпит неудачу. Я обновляю поток с образцами данных, чтобы вы могли понять мое требование. Возможно, Cross Join не требуется вообще. –

Смежные вопросы