CftClub.ru
Клуб специалистов ЦФТ-Банк

Убрать повторяющиеся записи
На страницу 1, 2  След.
 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle
Предыдущая тема :: Следующая тема  
Автор Сообщение
cool_dude
Участник - экстремал


Вступление в Клуб: 05.02.2013
СообщениеПт Июл 26, 2019 13:26   Убрать повторяющиеся записи Ответить с цитатой
Полезность: Нет оценки
Здравствуйте, уважаемые форумчане. Пишу отчет об адресах клиентов, у которых есть кредит. Отчет формируется без проблем. Но есть небольшая проблема. Проблема в том, что у некоторых клиентов есть по два или три адреса (например старый адрес и новый), или же один и тот же адрес сохранен два раза (например один без пробела, а другой с пробелом, и они отличаются). После выгрузки отчета у таких клиентов строки записи повторяются. т.е. если у клиента 4 счета и два адреса, то эти 4 счета для каждой записи адреса повторяется. Как сделать так, чтоб они не повторялись? И еще, можно ли для каждого клиента, объединит поля "Клиент", "Номер договора" и т.п., чтоб они тоже в каждой строке не повторялись? Ниже привел кусок своего кода. Прошу помочь в решении этой проблемы.
[code]
Procedure rep_ex_data
is
iRow integer := 5;
i integer := 0;
begin
for (select u(
u.[CLIENT].[NAME] :client_name,
u.[NUM_DOG] :num_dog,
u.[COM_STATUS].[NAME] :status_dogovora,
u.[CLIENT] :id_cl,
u.[FT_CREDIT].[CODE_ISO] :val_dog,
u.[ARRAY_DOG_ACC].[ACCOUNT_DOG].[1].[2].[MAIN_V_ID] :acc_all,
u.[ARRAY_DOG_ACC].[ACCOUNT_DOG].[1].[2].[SALDO] :acc_saldo,
u.[ARRAY_DOG_ACC].[ACCOUNT_DOG].[1].[2].[SALDO_NT] :acc_saldo_nt
)
in ::[PR_CRED] all
where u.[COM_STATUS] = ::[COM_STATUS_PRD]([code]='WORK') and u.[DEPART]=341664011 and u%CLASS = 'KRED_PERS'
ORDER BY u.[CLIENT].[NAME])
loop
for (select a(
a.[POST_CODE] :ind,
a.[CITY].[FULL_NAME] :gorod,
a.[STREET_STR] :ulitsa,
a.[KORPUS] :korpus,
a.[HOUSE] :dom,
a.[FLAT] :kv
)
in ::[PERSONAL_ADDRESS], (::[CLIENT] all : c) all
where c%id = u.id_cl and a%collection = c.[ADDRESSES])
loop
i := i + 1;
excel.write(iRow, 1, i);
excel.write(iRow, 2, u.client_name);
excel.write(iRow, 3, u.num_dog);
excel.write(iRow, 4, u.status_dogovora);
excel.write(iRow, 5, nvl(''''||u.val_dog, ''));
excel.write(iRow, 6, nvl(''''||u.acc_all, ''));
excel.write(iRow, 7, nvl(''''||u.acc_saldo, ''));
excel.write(iRow, 8, nvl(''''||u.acc_saldo_nt, ''));
excel.write(iRow, 9, a.ind||', '||a.gorod||', '||a.ulitsa||', '||a.korpus||', '||a.dom||', '||a.kv);
iRow := iRow + 1;
end loop;
end loop;
Draw_Caption_Rep;
end;
[/code]
    Матвеев Евгений
    Профи


    Вступление в Клуб: 31.01.2012
    СообщениеПт Июл 26, 2019 14:25   Re: Убрать повторяющиеся записи Ответить с цитатой
    Полезность: 1
    Пишу отчет об адресах клиентов, у которых есть кредит. Отчет формируется без проблем. Но есть небольшая проблема.

    Проблема в том, что у некоторых клиентов есть по два или три адреса (например старый адрес и новый), или же один и тот же адрес сохранен два раза (например один без пробела, а другой с пробелом, и они отличаются). После выгрузки отчета у таких клиентов строки записи повторяются. т.е. если у клиента 4 счета и два адреса, то эти 4 счета для каждой записи адреса повторяется. Как сделать так, чтоб они не повторялись?

    см. п.2 (ниже) плюс фильтр по типу адреса можно добавить, здесь

    select a(
    a.[POST_CODE] :ind,
    a.[CITY].[FULL_NAME] :gorod,
    a.[STREET_STR] :ulitsa,
    a.[KORPUS] :korpus,
    a.[HOUSE] :dom,
    a.[FLAT] :kv
    )
    in ::[PERSONAL_ADDRESS], (::[CLIENT] all : c) all
    where c%id = u.id_cl and a%collection = c.[ADDRESSES]) ... and тип адреса = [Адрес местонахождения][Место пребывания(фактического нахождения)][Юридический (для юр. лиц.)] и т.д. и т.п.
    loop

    ---------------

    И еще, можно ли для каждого клиента, объединит поля "Клиент", "Номер договора" и т.п., чтоб они тоже в каждой строке не повторялись? Ниже привел кусок своего кода. Прошу помочь в решении этой проблемы.

    Можно, запоминай предыдущие значения Клиента и Номера договора, как вариант, и выводи их только в случае различия текущих и предыдущих значений

    Плюс минус так должно выглядеть

    if u.client_name != old_client_name then
    excel.write(iRow, 2, u.client_name);
    old_client_name := u.client_name;
    end if;
    Volod
    Эксперт


    Вступление в Клуб: 19.09.2007
    СообщениеПт Июл 26, 2019 14:28    Ответить с цитатой
    Полезность: Нет оценки
    Адреса каких типов должны попадать в отчет?
    Если 2 адреса (например, старый и новый) - какой из них правильный?
    cool_dude
    Участник - экстремал


    Вступление в Клуб: 05.02.2013
    СообщениеПт Июл 26, 2019 15:29   Re: Убрать повторяющиеся записи Ответить с цитатой
    Полезность: Нет оценки
    Матвеев Евгений пишет:
    Пишу отчет об адресах клиентов, у которых есть кредит. Отчет формируется без проблем. Но есть небольшая проблема.

    Проблема в том, что у некоторых клиентов есть по два или три адреса (например старый адрес и новый), или же один и тот же адрес сохранен два раза (например один без пробела, а другой с пробелом, и они отличаются). После выгрузки отчета у таких клиентов строки записи повторяются. т.е. если у клиента 4 счета и два адреса, то эти 4 счета для каждой записи адреса повторяется. Как сделать так, чтоб они не повторялись?

    см. п.2 (ниже) плюс фильтр по типу адреса можно добавить, здесь

    select a(
    a.[POST_CODE] :ind,
    a.[CITY].[FULL_NAME] :gorod,
    a.[STREET_STR] :ulitsa,
    a.[KORPUS] :korpus,
    a.[HOUSE] :dom,
    a.[FLAT] :kv
    )
    in ::[PERSONAL_ADDRESS], (::[CLIENT] all : c) all
    where c%id = u.id_cl and a%collection = c.[ADDRESSES]) ... and тип адреса = [Адрес местонахождения][Место пребывания(фактического нахождения)][Юридический (для юр. лиц.)] и т.д. и т.п.
    loop

    ---------------

    И еще, можно ли для каждого клиента, объединит поля "Клиент", "Номер договора" и т.п., чтоб они тоже в каждой строке не повторялись? Ниже привел кусок своего кода. Прошу помочь в решении этой проблемы.

    Можно, запоминай предыдущие значения Клиента и Номера договора, как вариант, и выводи их только в случае различия текущих и предыдущих значений

    Плюс минус так должно выглядеть

    if u.client_name != old_client_name then
    excel.write(iRow, 2, u.client_name);
    old_client_name := u.client_name;
    end if;


    По типу адреса не могу исключить, потому что у этих адресов клиента одинаковые записи, только некоторые из них отличаются только пробелом, а в остальном всё совпадает.
    vtar
    Эксперт


    Вступление в Клуб: 20.03.2009
    СообщениеПт Июл 26, 2019 15:31    Ответить с цитатой
    Полезность: Нет оценки
    на хрен пробел.
    replace(addr, ' ', '')
    спасет отца русской демократии
    cool_dude
    Участник - экстремал


    Вступление в Клуб: 05.02.2013
    СообщениеПт Июл 26, 2019 15:34    Ответить с цитатой
    Полезность: Нет оценки
    Volod пишет:
    Адреса каких типов должны попадать в отчет?
    Если 2 адреса (например, старый и новый) - какой из них правильный?

    1) Адреса типа "Фактический" должны попадать в отчет. Это отчет для физ.лиц.
    2) По тех. заданию, оба адреса должны выходить в отчет. Есть такие моменты, что наши операционисты оба адреса (и в старом и в новом) вставят галочки "Фиксировать".
    Volod
    Эксперт


    Вступление в Клуб: 19.09.2007
    СообщениеПт Июл 26, 2019 15:37    Ответить с цитатой
    Полезность: Нет оценки
    Не понятно тогда, какие адреса не должны попадать?
    Которые различаются каким-либо реквизитом (без учета пробелов)?
    Группировка по реквизитам адреса поможет.
    cool_dude
    Участник - экстремал


    Вступление в Клуб: 05.02.2013
    СообщениеПт Июл 26, 2019 15:45    Ответить с цитатой
    Полезность: Нет оценки
    Volod пишет:
    Не понятно тогда, какие адреса не должны попадать?
    Которые различаются каким-либо реквизитом (без учета пробелов)?
    Группировка по реквизитам адреса поможет.

    Не должны попадать те адреса, которые отличаются только пробелами.
    Остальные, все, должны попадать.
    Группировку по реквизитам, как сделать?
    cool_dude
    Участник - экстремал


    Вступление в Клуб: 05.02.2013
    СообщениеПт Июл 26, 2019 15:46    Ответить с цитатой
    Полезность: Нет оценки
    vtar пишет:
    на хрен пробел.
    replace(addr, ' ', '')
    спасет отца русской демократии

    Что-то не помог... Sad
    Volod
    Эксперт


    Вступление в Клуб: 19.09.2007
    СообщениеПт Июл 26, 2019 16:43    Ответить с цитатой
    Полезность: Нет оценки
    cool_dude пишет:

    Группировку по реквизитам, как сделать?

    group by?
    Volod
    Эксперт


    Вступление в Клуб: 19.09.2007
    СообщениеПт Июл 26, 2019 16:45    Ответить с цитатой
    Полезность: Нет оценки
    И еще, приведи пример, как должно быть в отчете, если у клиента 4 счета и два адреса, "меня терзают смутные сомнения"
    Volod
    Эксперт


    Вступление в Клуб: 19.09.2007
    СообщениеПт Июл 26, 2019 16:49    Ответить с цитатой
    Полезность: Нет оценки
    Кстати, сколько строк в отчете будет?
    excel.write не оптимально будет, да и вложенный селект тоже плохо
    Матвеев Евгений
    Профи


    Вступление в Клуб: 31.01.2012
    СообщениеПт Июл 26, 2019 16:51    Ответить с цитатой
    Полезность: Нет оценки
    vtar пишет:
    на хрен пробел.
    replace(addr, ' ', '')
    спасет отца русской демократии


    Как вариант вот так

    Код:

    REGEXP_REPLACE(Adr, ' ')
    Матвеев Евгений
    Профи


    Вступление в Клуб: 31.01.2012
    СообщениеПт Июл 26, 2019 16:59    Ответить с цитатой
    Полезность: Нет оценки
    cool_dude пишет:

    Если 2 адреса (например, старый и новый) - какой из них правильный?
    1) Адреса типа "Фактический" должны попадать в отчет. Это отчет для физ.лиц.


    Выводи в два этапа, сначала строго по фактическому, плюс запоминай без пробелов

    Потом все остальные с проверкой значений на соответствие значению из первого пункта

    cool_dude пишет:

    2) По тех. заданию, оба адреса должны выходить в отчет. Есть такие моменты, что наши операционисты оба адреса (и в старом и в новом) вставят галочки "Фиксировать".


    Если галка фиксировать, то что?
    cool_dude
    Участник - экстремал


    Вступление в Клуб: 05.02.2013
    СообщениеПн Июл 29, 2019 12:59    Ответить с цитатой
    Полезность: Нет оценки
    Матвеев Евгений пишет:


    Если галка фиксировать, то что?

    Да ничего. Просто по этому полю тоже невозможно фильтровать. Я как вариант хотел взять только фиксированные, а оказывается наши "супер" операционисты во всех адресах вставят такую галку...)
    Показать сообщения:   
    Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle Часовой пояс: GMT + 3
    На страницу 1, 2  След.
    Страница 1 из 2

     
    Перейти:  
    Вы не можете начинать темы
    Вы не можете отвечать на сообщения
    Вы не можете редактировать свои сообщения
    Вы не можете удалять свои сообщения
    Вы не можете голосовать в опросах
    Рейтинг@Mail.ru