Forum Użytkownikow Subiekt GT

InsERT GT => Dodatki - zestawienia - sfera => Wątek zaczęty przez: Dereks w Wrzesień 20, 2022, 10:53:24

Tytuł: Zestawienie sprzedaży i korekt
Wiadomość wysłana przez: Dereks w Wrzesień 20, 2022, 10:53:24
Próbuję poskładać zestawienie pokazujące sprzedaż poszczególnych towarów, ilość i wartość oraz zwroty na podstawie faktur sprzedaży i korekt sprzedaży.  Zestawienie poniżej pokazuje błędne dane. Pytanie czy takie zestawienie ma prawo działać poprawnie ? próbowałem z dok_pozycja ale z podobnym skutkiem. Będę wdzięczny za wskazówkę



SELECT
adr_Nazwa AS [Nazwa]
--, adr_Adres AS [Adres]
--, adr_Miejscowosc AS [Miejscowość]


,tw_Nazwa [Nazwa towaru]
,sum(FS.ob_Ilosc) as [sprz.Ilość]
,sum(FS.ob_WartNetto) as [sprz.netto]
,sum(KFS.ob_Ilosc) as [sprz.korekta]
,sum(KFS.ob_WartNetto) as [kor.netto]


FROM vwZstSprzWgKhnt FS

LEFT JOIN  vwZstSprzWgKhnt KFS on   FS.dok_Id = KFS.dok_DoDokId AND KFS.dok_Typ = 6
LEFT JOIN dok__Dokument Z ON (FS.dok_Id= Z.dok_Id)
 LEFT JOIN tw__Towar ON tw_Id = FS.ob_TowId
 LEFT JOIN adr__Ewid ON (Z.dok_OdbiorcaId = adr_IdObiektu AND adr_TypAdresu = 1)
LEFT JOIN kh__Kontrahent AS OdbKh ON (Z.dok_OdbiorcaId = OdbKh.kh_Id )



WHERE FS.dok_Typ = 2

--AND KFS.ob_WartNetto IS NOT NULL

AND ((adr_TypAdresu = 1) OR (FS.dok_PlatnikId IS NULL)) 
AND (
( (FS.dok_DataWyst>={D:Data wystawienia od:})
AND (FS.dok_DataWyst<={D:Data wystawienia do:})
))
AND --Magazyn
(FS.dok_MagId IN  ( {CHL_DB: SELECT mag_Id,mag_Nazwa FROM sl_Magazyn WHERE mag_Id>6:Magazyn:0:(nie wybrano)}))



GROUP BY


adr_Adres
,adr_Miejscowosc
,adr_Nazwa
,tw_Nazwa

Tytuł: Odp: Zestawienie sprzedaży i korekt
Wiadomość wysłana przez: Chris w Wrzesień 20, 2022, 21:49:53
Ponieważ wszystkie dane masz w jednej tabeli, to powinieneś skorzystać z warunkowego sumowania, zamiast tworzyć sztuczne powiązania między tą samą tabelą, myślę, że ten kawałek wystarczy  :)

,sum (case when FS.dok_Typ = 2 then (FS.ob_Ilosc * FS.ob_Znak) else 0 end) as [sprz.Ilość]
,sum (case when FS.dok_Typ = 2 then (FS.ob_WartNetto * FS.ob_Znak) else 0 end) as [sprz.netto]
,sum (case when FS.dok_Typ = 6 then (FS.ob_Ilosc * FS.ob_Znak) else 0 end) as [sprz.korekta]
,sum (case when FS.dok_Typ = 6 then (FS.ob_WartNetto * FS.ob_Znak) else 0 end) as [kor.netto]


Tytuł: Zestawienie sprzedaży i korekt
Wiadomość wysłana przez: Dereks w Wrzesień 21, 2022, 17:05:11
Dzięki! działa, sumy są poprawne.  Mam jeszcze jedno pytanie, jak dodać warunek ograniczający wynik tylko do pozycji korygowanych ? We wcześniejszej wersji to było proste AND KFS.ob_WartNetto IS NOT NULL , ale tam były różne aliasy. Tutaj mam problem.

EDIT: Klauzula HAVING rozwiązała problem. :)

SELECT
adr_Nazwa AS [Nazwa]
--, adr_Adres AS [Adres]
--, adr_Miejscowosc AS [Miejscowość]


,tw_Nazwa [Nazwa towaru]
,sum (case when FS.dok_Typ = 2 then (FS.ob_Ilosc * FS.ob_Znak) else 0 end) as [sprz.Ilość]
,sum (case when FS.dok_Typ = 2 then (FS.ob_WartNetto * FS.ob_Znak) else 0 end) as [sprz.netto]
,sum (case when FS.dok_Typ = 6 then (FS.ob_Ilosc * FS.ob_Znak) else 0 end) as [kor.ilosc]
,sum (case when FS.dok_Typ = 6 then (FS.ob_WartNetto * FS.ob_Znak) else 0 end) as [kor.netto]

FROM vwZstSprzWgKhnt FS


LEFT JOIN dok__Dokument Z ON (FS.dok_Id= Z.dok_Id)
 LEFT JOIN tw__Towar ON tw_Id = FS.ob_TowId
 LEFT JOIN adr__Ewid ON (Z.dok_OdbiorcaId = adr_IdObiektu AND adr_TypAdresu = 1)
LEFT JOIN kh__Kontrahent AS OdbKh ON (Z.dok_OdbiorcaId = OdbKh.kh_Id )

WHERE


((adr_TypAdresu = 1) OR (FS.dok_PlatnikId IS NULL)) 
AND (
( (FS.dok_DataWyst>={D:Data wystawienia od:})
AND (FS.dok_DataWyst<={D:Data wystawienia do:})
))
AND --Magazyn
(FS.dok_MagId IN  ( {CHL_DB: SELECT mag_Id,mag_Nazwa FROM sl_Magazyn WHERE mag_Id>6:Magazyn:0:(nie wybrano)}))


GROUP BY
adr_Adres
,adr_Miejscowosc
,adr_Nazwa
,tw_Nazwa
HAVING sum (case when FS.dok_Typ = 6 then (FS.ob_WartNetto * FS.ob_Znak) else 0 end) < 0