Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Помогите найти ошибку...  [new]
E_u_g_e_n_E
Member

Откуда: Тверская обл., г. Кимры / Москва
Сообщений: 130
Делаю следующее

Есть внешняя таблица на CSV. В ней есть вот такие данные.

select * from BUFFER_CHARGE c where c.insurance_contract = '52 1C 1OM'

INSURANCE_CONTRACT CHARGE_DATE CHARGE_SUM PAYMENTS_TYPE
52 1C 1OM 09.06.2007 400000 Начисление премии
52 1C 1OM 09.06.2007 0 Начисление премии
52 1C 1OM 01.11.2007 -400000 Начисление премии
52 1C 1OM 01.11.2007 10901.25 Начисление премии
52 1C 1OM 01.11.2007 0 Начисление премии


После таблица связывается с измерениями (присваиваются ID и происходит группировка по контракту и дню)

SELECT 
    INSURANCE_CONTRACT_ID,
    PAYMENTS_TYPE_ID,
    PAYMENT_DATE,
    Sum(PAYMENT_SUM) as PAYMENT_SUM
FROM
(
SELECT
  ic.id as INSURANCE_CONTRACT_ID,
  pt.id as PAYMENTS_TYPE_ID,
  to_date(c.CHARGE_DATE,'dd.mm.yyyy') AS PAYMENT_DATE,
  to_number(c.CHARGE_SUM,'999999999999.99') AS PAYMENT_SUM
FROM BUFFER_CHARGE c
INNER JOIN dwh_insurance_contract ic on  ic.business_key = upper(trim(c.insurance_contract)) and ic.end_date = to_date('31.12.2100','dd.mm.yyyy')
INNER JOIN dwh_payments_type pt on  pt.business_key = upper(trim(c.PAYMENTS_TYPE)) and pt.end_date = to_date('31.12.2100','dd.mm.yyyy')
where c.insurance_contract = '52 1C 1OM'
)
group by INSURANCE_CONTRACT_ID, PAYMENTS_TYPE_ID, PAYMENT_DATE;

Получаю вот это...

INSURANCE_CONTRACT_ID PAYMENTS_TYPE_ID PAYMENT_DATE PAYMENT_SUM
5658825 19497 01.11.2007 -389098.75
5658825 19497 09.06.2007 400000


И это на примере одного контракта

Пытаюсь все тоже сделать и записать результат во временную табличку
Вот так:

DROP TABLE TMP_CHARGE;

CREATE TABLE TMP_CHARGE
(
    INSURANCE_CONTRACT_ID   NUMBER(22) NULL,
    PAYMENTS_TYPE_ID        NUMBER(22) NULL,
    PAYMENT_DATE            DATE NULL,
    PAYMENT_SUM             NUMBER(22,2) NULL
);

INSERT INTO TMP_CHARGE
(
    INSURANCE_CONTRACT_ID,
    PAYMENTS_TYPE_ID,
    PAYMENT_DATE,
    PAYMENT_SUM
)
SELECT 
    INSURANCE_CONTRACT_ID,
    PAYMENTS_TYPE_ID,
    PAYMENT_DATE,
    Sum(PAYMENT_SUM) as PAYMENT_SUM
FROM
(
    SELECT
        ic.id as INSURANCE_CONTRACT_ID,
        pt.id as PAYMENTS_TYPE_ID,
        to_date(c.CHARGE_DATE,'dd.mm.yyyy') AS PAYMENT_DATE,
        to_number(c.CHARGE_SUM,'999999999999.99') AS PAYMENT_SUM
    FROM BUFFER_CHARGE c
    INNER JOIN dwh_insurance_contract ic on  ic.business_key = upper(trim(c.insurance_contract)) and ic.end_date = to_date('31.12.2100','dd.mm.yyyy')
    INNER JOIN dwh_payments_type pt on  pt.business_key = upper(trim(c.PAYMENTS_TYPE)) and pt.end_date = to_date('31.12.2100','dd.mm.yyyy')
)
group by INSURANCE_CONTRACT_ID, PAYMENTS_TYPE_ID, PAYMENT_DATE;

COMMIT;

Получаю следующее

select * from tmp_charge where insurance_contract_id = 5658825

INSURANCE_CONTRACT_ID PAYMENTS_TYPE_ID PAYMENT_DATE PAYMENT_SUM
5658825 19497 01.11.2007 10901.25
5658825 19497 09.06.2007 400000.00


Что то я нифига не понимаю что происходит? как он складывает то? Видимо ляп где-то...

С уважением,
Лобанов Евгений
8 июл 09, 15:13    [7392115]     Ответить | Цитировать Сообщить модератору
 Re: Помогите найти ошибку...  [new]
suPPLer
Member

Откуда: Харків, Україна
Сообщений: 7794
Блог
E_u_g_e_n_E,

у Вас во втором большом запросе вот этой строки нет:

where c.insurance_contract = '52 1C 1OM'

Не влияет?
8 июл 09, 15:26    [7392181]     Ответить | Цитировать Сообщить модератору
 Re: Помогите найти ошибку...  [new]
E_u_g_e_n_E
Member

Откуда: Тверская обл., г. Кимры / Москва
Сообщений: 130
suPPLer
E_u_g_e_n_E,

у Вас во втором большом запросе вот этой строки нет:

where c.insurance_contract = '52 1C 1OM'

Не влияет?


В том то и дело, что это

where c.insurance_contract = '52 1C 1OM'

всего лишь демонстрация по одному договору. Грубо говря при сверке выгрузки в ХД по этому договору расходятся платежи. Начали разбираться в источнике суммы


INSURANCE_CONTRACT, CHARGE_DATE, CHARGE_SUM, PAYMENTS_TYPE 
52 1C 1OM, 09.06.2007, 400000, Начисление премии 
52 1C 1OM, 09.06.2007, 0, Начисление премии 
52 1C 1OM, 01.11.2007, -400000, Начисление премии 
52 1C 1OM, 01.11.2007, 10901.25, Начисление премии 
52 1C 1OM, 01.11.2007, 0, Начисление премии 

И итог 10901.25

А у нас в Оракле фигня какая-то 410901.25 (400 000 разница)
8 июл 09, 15:32    [7392216]     Ответить | Цитировать Сообщить модератору
 Re: Помогите найти ошибку...  [new]
E_u_g_e_n_E
Member

Откуда: Тверская обл., г. Кимры / Москва
Сообщений: 130
E_u_g_e_n_E,

Поменял порядок группировки с

INSURANCE_CONTRACT_ID, PAYMENTS_TYPE_ID, PAYMENT_DATE

на

PAYMENTS_TYPE_ID,INSURANCE_CONTRACT_ID, PAYMENT_DATE

почему результат изменился? PAYMENTS_TYPE_ID всегда один для всей таблицы...
8 июл 09, 15:42    [7392283]     Ответить | Цитировать Сообщить модератору
 Re: Помогите найти ошибку...  [new]
Mapuo
Member

Откуда:
Сообщений: 101
может дело в inner join ?? попробуй переписать запрос через обычные предикаты "="....
8 июл 09, 15:47    [7392307]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить