Zapytanie Oracle SQL

0

Cześć, dopiero raczkuje w SQLu i bardzo proszę o pomoc w napisaniu zapytania w SQL. Napisałem coś takiego jak poniżej:

SELECT l.CONTRACT_NO, l.CON_BALANCE_TOTAL_AMOUNT, l.cli_regon_pesel, B.REGON_PESEL, B.BASE_FUNDS, b.GUARANTEED_FUNDS
FROM rep_l l
JOIN guarantee b on
(l.cli_regon_pesel = LTRIM(B.regon_pesel, 'P-')) and L.rep_date = b.rep_date and l.b_id=b.b_id
WHERE L.rep_date = 20170630 and L.b_id = 06 and l.ntee = 'Y'
group by l.CONTRACT_NO, l.CON_BALANCE_TOTAL_AMOUNT, l.cli_regon_pesel, B.REGON_PESEL, B.BASE_FUNDS,
b.GUARANTEED_FUNDS
ORDER BY L.CLI_REGON_PESEL;

Zapytanie daje mi z bazy 37032 wyników.

Zdarza się, że jeden cli_regon_pesel posiada kilka CON_BALANCE_TOTAL_AMOUNT, a co gorsze zdarza się że wartości się powtarzają np.
CON_BALANCE_TOTAL_AMOUNT cli_regon_pesel
14,44 008
4,27 008
4,27 008
14,44 008

Chciałbym, aby wynik dla tego klienta był 18,71.

Myślałem o czymś w stylu select case when count(cli_regon_pesel) >1 then sum(CON_BALANCE_TOTAL_AMOUNT) else 0 end ....., ale nie działa.
Bardzo proszę o pomoc

1
  1. Stosuj formatowanie
  2. Jeśli chcesz się pozbyć "zdublowanych" rekordów użyj DISTINCT
  3. Dlaczego "nie działa" - pokaż wyjątek, który zwrócił Ci oracle
  4. Przygotuj przykład tutaj: http://sqlfiddle.com/ jeśli mamy Ci pomóc

W oracle jest mnóstwo fajnych mechanizmów analitycznych więc da się zrobić nie mal wszystko. Może zamiast case można by użyć np DANSE RANK ale tak jak mówię ciężko się to czyta co przygotowałeś/aś

2

https://www.freeformatter.com/sql-formatter.htm

SELECT
  l.CONTRACT_NO,
  l.CON_BALANCE_TOTAL_AMOUNT,
  l.cli_regon_pesel,
  B.REGON_PESEL,
  B.BASE_FUNDS,
  b.GUARANTEED_FUNDS 
FROM
  rep_l l 
  JOIN
    guarantee b 
    on (l.cli_regon_pesel = LTRIM(B.regon_pesel, 'P-')) 
    and L.rep_date = b.rep_date 
    and l.b_id = b.b_id 
WHERE
  L.rep_date = 20170630 
  and L.b_id = 06 
  and l.ntee = 'Y' 
group by
  l.CONTRACT_NO,
  l.CON_BALANCE_TOTAL_AMOUNT,
  l.cli_regon_pesel,
  B.REGON_PESEL,
  B.BASE_FUNDS,
  b.GUARANTEED_FUNDS 
ORDER BY
  L.CLI_REGON_PESEL;

pytanie podstawowe jest takie - dlaczego są duble, skąd się biorą. Bez przykładowych danych ciężko coś konkretnie powiedzieć.

BTW distinct prawie zawsze wskazuje na błąd w zapytaniu

0

Przykładowych danych nie mogę pokazać. Pomyślałem o join na dwóch selectach:

SELECT
*
FROM
(
select
cli_regon_pesel,
sum(CON_BALANCE_TOTAL_AMOUNT)
from
rep_l
WHERE
rep_date = 20170630
and b_id = 06
Group by
cli_regon_pesel
) l
JOIN
(
select
LTRIM(REGON_PESEL, 'P-'),
max(guaranteed_funds),
max(base_funds)
from
guarantee
WHERE
rep_date = 20170630
and b_id = 06
group by
LTRIM(REGON_PESEL, 'P-')
) b
on l.cli_regon_pesel = LTRIM(B.regon_pesel, 'P-');

Pokazuję mi błąd;

ORA-00904: "B"."REGON_PESEL": niepoprawny identyfikator
00904. 00000 - "%s: invalid identifier

1

Aliasy

0

Gdzie są aliasy w tym select? Regon_pesel jest nazwa kolumny z tabeli, to nie jest alias

1

no właśnie nie ma aliasów dla pól w tym zapytaniu. Mam wrażenie, że nie do końca wiesz co robisz i próbujesz metodą prób i błędów, sklejając przypadkowe fragmenty kodu, dojść do wyniku jaki Cię interesuje. Niestety to tak nie działa

0

Tak jak pisałem wcześniej dopiero się tego uczę. Nic nie sklejam tylko próbuje coś sensownego napisać. Już rozumiem o co chodzi z alias.

select
LTRIM(REGON_PESEL, 'P-') REGON_PESEL,
max(guaranteed_funds),
max(base_funds)
from
guarantee
WHERE
rep_date = 20170630
and b_id = 06
group by
LTRIM(REGON_PESEL, 'P-')
) b
on l.cli_regon_pesel = LTRIM(B.regon_pesel, 'P-');

1
  (select
    LTRIM(REGON_PESEL, 'P-') REGON_PESEL,
    max(guaranteed_funds),
    max(base_funds)
  from
    guarantee
  WHERE
    rep_date = 20170630
    and b_id = 06
  group by
    LTRIM(REGON_PESEL, 'P-')
  ) b
on l.cli_regon_pesel = LTRIM(B.regon_pesel, 'P-');

jeśli w drugiej linii już wycinasz P- z początku ciągu - tu LTRIM(REGON_PESEL, 'P-') REGON_PESEL, to w ostatniej linii - tu on l.cli_regon_pesel = LTRIM(B.regon_pesel, 'P-'); już tego robić nie musisz bo tego już tam nie ma i powinna ona wyglądać tak on l.cli_regon_pesel = B.regon_pesel;

0

@abrakadaber bardzo dziękuje za wyjaśnienie

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.