Temat: [Oracle] pewien rodzaj grupowania, sumowania, tylko jaki?

Witam,

Jak zsumować poniższe dane tak by powtarzające kwoty się nie dodawały:

kat, typ, liczba
a xx 12,12
a xx 12,12
a yy 41,88
b zz 33,34
b zz 33,34
b hh 61,41
b hh 61,41

pożądany wynik:

a xx 12,12
a yy 41,88
b zz 33,34
b hh 61,41

a jeszcze lepiej, po prostu suma(liczba) (tylko w taki sposób by nie były sumowane kolejne duplikaty)
Łukasz W.

Łukasz W. SQL/ETL/BI

Temat: [Oracle] pewien rodzaj grupowania, sumowania, tylko jaki?

select kat,typ, sum(distinct liczba) from xxx
group by kat,typ
albo
select kat,typ, sum(liczba) from (select kat,typ, sum(distinct liczba) from xxx group by kat,typ) as tttTen post został edytowany przez Autora dnia 05.05.15 o godzinie 16:42
Marek Węgierski

Marek Węgierski Programista,
Accenture Sp. z o.o.

Temat: [Oracle] pewien rodzaj grupowania, sumowania, tylko jaki?

Łukasz W.:
select kat,typ, sum(distinct liczba) from xxx
group by kat,typ
albo
select kat,typ, sum(liczba) from (select kat,typ, sum(distinct liczba) from xxx group by kat,typ) as ttt
Wyprzedziłeś mnie :D

Temat: [Oracle] pewien rodzaj grupowania, sumowania, tylko jaki?

Nie dodałem jeszcze że w tej samej tabeli obok są pola które połączyły się po pewnym id

i tam też musi nastąpić grupowanie

duble są związane właśnie z tymi dołączonymi danymi.

Wydaje mi się że to raczej dałoby się załtwić czymś w rodzaju:

sum(over) (partition by typ, liczba)

tyle że ja nie chcę sumy a unikalną wartość może min.

Opisze szerzej problem

są naliczone należności i odpowiadające im płatności.

Płatności często jest więcej niż należności - liczbowo, lub odwrotnie czasem jedna płatność pokrywa 2,5 faktury,

Przykład
Gdyby były 3 faktury na

100
100
200 zł

płatność na 280 zł

roczliczyłaby w pełni dwie pierwsze i 80 zł z ostatniej.
A kolejna płatność na 280 zł rozliczyłaby już w pełni 3 fakturę i jeszcze by zostało.
Mechanizm działa, moim zadaniem jest wykazanie że na x zł z faktur jest y zł z wpłat.

Zrobiłem widok który łącząc po identyfikatorze matchującym, potworzył pary.

nalezność-płatność

wadą jest tworzenie duplikatów po jednej lub drugiej stronie w zależności czy była sytuacja

1 płatność pokrywająca wiele faktur
czy 1 faktura opłacona wieloma płatnościami

p_book - płatności
n_book - należność

https://www.dropbox.com/s/2e3ys7i4bbdv4ar/Oracle.gif?dl=0
Marcin Mackiewicz

Marcin Mackiewicz Programista JAVA, RS
Adware Polska

Temat: [Oracle] pewien rodzaj grupowania, sumowania, tylko jaki?

To o czym piszesz to według mnie rozwiązanie na trzy tabele a nie na dwie. Obrazowo (PostreSQL):
CREATE TABLE platnosci(
id_platnosci SERIAL PRIMARY KEY,
id_dokumentu_kasowego INT,
kwota_platnosci FLOAT
);

CREATE TABLE wplaty(
id_wplaty SERIAL PRIMARY KEY,
kwota_wplaty FLOAT
);

CREATE TABLE platnosci_wplaty(
id_platnosci INT,
id_wplaty INT,
kwota_parowania FLOAT,
PRIMARY KEY (id_platnosci, id_wplaty)
FOREIGN KEY (id_platnosci) REFERENCES platnosci (id_platnosci)
MATCH SIMPLE ON UPDATE CASCADE ON DELETE CASCADE,
FOREIGN KEY (id_wplaty) REFRENCES wplaty(id_wplaty)
MATCH SIMPLE ON UPDATE CASCADE ON DELETE CASCADE
);
Masz tabele z płatnościami, wpłatami oraz pamiętającą parowania i kwoty parowań. Zakładam tu, że parowanie płatności z wpłatą może nastąpić tylko raz oraz do jednej płatności może być wiele parowań a jedna wpłata może być rozbita na kilka płatności.

Teraz wypadałoby założyć trigger on insert oraz update na tabeli wpłaty, który uruchomi funkcję według algorytmu:
1. Szukaj wpłat które nie zostały w całości rozłożone na płatności i oblicz dla każdej wpłaty kwotę do rozbicia
2. Szukaj płatności które nie zostały w całości zapłacone
3. Jeżeli nowa wpłata (insert)
a) Dodaj kwoty parowania dla płatności niezapłaconych posortowanych po terminie płatności począwszy od najstarszej.
b) Powtarzaj 3a tak długo aż kwota wpłaty będzie 0 albo kwota płatności do zapłaty będzie 0 a następnie zakończ działanie
4. Jeżeli zmiana istniejącej wpłaty (update) i zmiana kwoty wpłaty na większą
a) Wyszukaj wszystkie płatności do których są parowania z wpłaty a następnie sprawdź czy te płatności są do zapłaty.
b) Jeżeli są parowania i dla tych parowań są płatności jeszcze do zapłaty to skasuj te parowania i wykonaj nowe według pkt 3 (ale tylko dla płatności sparowanych ze zmienianą wpłatą)
c) Jeżeli są parowania i dla tych parowań nie ma płatności do zapłaty to wykonaj nowe parowania według pkt3
5. Jeżeli zmiana istniejącej wpłaty (update) i zmiana kwoty wpłaty na mniejszą
a) Wyszukaj parowania dla zmienianej wpłaty a następnie zmniejszaj kwoty parowań dla płatności z najpóźniejszym terminem płatności.
b) Jeżeli kwota zmniejszanego parowania jest 0 to usuń parowanie.

Analogicznie trzeba zrobić na tabeli płatności bo każda zmiana płatności może spowodować nadpłatę lub niedopłatę.

Trochę skomplikowane ale wyciąganie dokumentów kasowych oraz wyliczanie do nich kwot do zapłaty/nadpłaty albo jest wtedy proste. Tak samo obliczanie salda czy sprawdzanie niezgodności.

Następna dyskusja:

Jaki framework javt do bazy...




Wyślij zaproszenie do