Autor Wątek: Zestawienie sprzedaży i korekt  (Przeczytany 2256 razy)

0 użytkowników i 1 Gość przegląda ten wątek.

Offline Dereks

  • Użytkownik
  • **
  • Wiadomości: 69
  • Reputacja +0/-0
  • Wersja programu: Najnowsza
Zestawienie sprzedaży i korekt
« dnia: 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


Offline Chris

  • Zaawansowany użytkownik
  • ****
  • Wiadomości: 2846
  • Reputacja +275/-0
  • Wersja programu: GT, Nexo - aktualne
Odp: Zestawienie sprzedaży i korekt
« Odpowiedź #1 dnia: 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]


Krzysztof, Radom

Offline Dereks

  • Użytkownik
  • **
  • Wiadomości: 69
  • Reputacja +0/-0
  • Wersja programu: Najnowsza
Zestawienie sprzedaży i korekt
« Odpowiedź #2 dnia: 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
« Ostatnia zmiana: Wrzesień 22, 2022, 16:46:51 wysłana przez Dereks »

Forum Użytkownikow Subiekt GT

Zestawienie sprzedaży i korekt
« Odpowiedź #2 dnia: Wrzesień 21, 2022, 17:05:11 »