Pomoc przy przetworzeniu tabeli - baza wydatków

0

Witam,

Pracuję nad prostą aplikacją, która pomoże mi przy rozliczaniu się rodziną ze wspólnych pieniędzy na wakacjach. Mam już widok (vwFlow), który pokazuje mi kto kupował jakąś rzecz (buyerid) a kto za nią płacił (payerid). Teraz chciałbym zrobić końcowy widok, gdzie będę miał podsumowanie, kto komuś ile wisi pieniędzy. Czyli w tym przypadku np. Adam kupił coś Darkowi za 56, ale Darek kupił Adamowi rzecz za 24 zł, więc Darek jest finalnie winny Adamowi (56-24) = 32 zł.

user image

Udało mi się zrobić już widok w 2 wersjach, ale domyślam się że bardzo na około:) - vwFinal, vwFinal2, który dobrze mi wylicza wartości właśnie dla powyższego przypadku, kiedy 2 osoby wiszą sobie nawzajem jakieś pieniądze.

Problem, że nie umiem tego skonsolidować z pozostałymi wartoścami, gdzie np. tylko jedna osoba za kogoś płaciła.Chciałbym to wszystko mieć w jednej tablicy.

W załączniku przesyłam bazę

1

Generalnie musisz mieć jeden pomocniczy widok (u mnie jako podzapytanie m i h) gdzie sumujesz po polach payer i buyer. Dałem warunek że płacący i kupujący są od siebie rózni, bo te rekordy nie mają znaczenia do ponownych rozliczeń. Teraz w zapytaniu szukasz czy płacący nie jest jednocześnie kupującym w dla płacącego (warunek połączenia m i h). Odejmujesz kwotę z odwrotności relacji płacący<->kupujący i jeżeli jest większa od zera to to jestkwota która cię interesuje:

SELECT m.p,
       p.Name PayerName,
       m.b,
       b.Name BuyerName,
       m.pr - ifnull(h.pr, 0) price
  FROM (
           SELECT payer p,
                  buyer b,
                  sum(price) pr
             FROM saledetails
            WHERE buyer <> payer
            GROUP BY payer,
                     buyer
       )
       m
       LEFT JOIN
       (
           SELECT payer p,
                  buyer b,
                  sum(price) pr
             FROM saledetails
            WHERE buyer <> payer
            GROUP BY payer,
                     buyer
       )
       h ON m.p = h.b AND 
            m.b = h.p
       INNER JOIN
       persons AS b ON m.b = b.personid
       INNER JOIN
       persons p ON m.p = p.personid
 WHERE m.pr - ifnull(h.pr, 0) > 0;
;

1 użytkowników online, w tym zalogowanych: 0, gości: 1