SQL - data ostatniej sprzedaży

Zapytania SQL, widoki, Crystal, definicje filtrów, szybkich raportów, wydruków, API, Hydra, .NET

Moderator: mikey

Awatar użytkownika
rgrobelny
Posty: 41
Rejestracja: 20 kwie 2008, 19:05
Rola: Administrator CDN XL
Wersja: 9.6

SQL - data ostatniej sprzedaży

Post autor: rgrobelny »

Próbuję zrobić wydruk z podstawowymi informacjami o klientach. Utknąłem na pobieraniu informacji o dacie ostatniej sprzedaży do klienta:

Kod: Zaznacz cały

select

Knt_GIDNumer,
knt_akronim,
Nazwa=RTRIM(Knt_Nazwa1)+RTRIM(' '+Knt_Nazwa2)+RTRIM(' '+Knt_Nazwa3),
Miejscowosc=Knt_KodP+' '+Knt_Miasto,
Knt_Ulica,
Knt_Telefon1,
Knt_NipE,

   CASE
      WHEN Knt_FormaPl BETWEEN 10 AND 19 THEN 'gotówka'
      WHEN Knt_FormaPl BETWEEN 20 AND 29 THEN 'przelew'
   ELSE ''
   END,
Knt_LimitOkres,

Data=convert(varchar(10), dateadd(day, TrN_Data2, '18001228'), 120)

from cdn.kntkarty AS X

LEFT OUTER JOIN CDN.TraNag ON Trn_KntNumer = Knt_GIDNumer

where {filtrSQL} and TrN_TrNTyp=3 and TrN_Data2=
(select max(TrN_Data2) from CDN.TraNag WHERE X.Knt_GIDNumer = Trn_KntNumer group by Trn_KntNumer)
Problem polega na tym że to zapytanie zwraca tylko kontrahentów którzy dokonali jakiekolwiek zakupy. Mnie natomiast interesuje takie zapytanie, gdzie zwracani są wszyscy kontrahenci ograniczeni wyłącznie przez {filtrSQL}. Jeśli transakcji z klientem nie ma w bazie, w kolumnie z datą powinna pojawić się wartość NULL (a najlepiej w jej zastępstwie jakiś tekst, np 'brak FS')

Awatar użytkownika
TrunX
Posty: 75
Rejestracja: 05 maja 2008, 12:43
Rola: Konsultant CDN XL
Lokalizacja: wilkopolskie

Re: SQL - data ostatniej sprzedaży

Post autor: TrunX »

Do klauzuli WHERE Twoje zapytanie wyrzuci tych z null'ami. Potem w warunku mówisz, ze chcesz takie transakcje gdzie TrN_Cośtam jest równe czemuś, ergo <> null. Mógłbym Tobie podać solution, ale ta informacja powinna wystarczyć, a jak sam zrobisz to będziesz lepiej rozumiał i pamiętał ;)

Awatar użytkownika
rgrobelny
Posty: 41
Rejestracja: 20 kwie 2008, 19:05
Rola: Administrator CDN XL
Wersja: 9.6

Re: SQL - data ostatniej sprzedaży

Post autor: rgrobelny »

Piękne dzięki za naprowadzenie :D

marceynowa
Posty: 347
Rejestracja: 29 lut 2008, 11:27
Rola: Administrator CDN XL
Wersja: 2022
Lokalizacja: Gdynia

Re: SQL - data ostatniej sprzedaży

Post autor: marceynowa »

Naprowadzenie było, ale i tak siedziałem prawie godzinę.
Napisałem tak:

Kod: Zaznacz cały


SELECT     Knt_GIDNumer, Knt_Akronim, RTRIM(Knt_Nazwa1) +' '+RTRIM(Knt_Nazwa2) +' '
                      + RTRIM(Knt_Nazwa3) AS Nazwa, Knt_KodP + ' ' + Knt_Miasto AS Miejscowosc, Knt_Ulica,
                       Knt_Telefon1, Knt_NipE, CASE WHEN Knt_FormaPl BETWEEN 10 AND 19 THEN 'gotówka' WHEN Knt_FormaPl BETWEEN 
                      20 AND 29 THEN 'przelew' ELSE '' END AS Expr1, Knt_LimitOkres, CONVERT(varchar(10), DATEADD(day, MAX(TrN_Data2), '18001228'), 120) AS Data
FROM         CDN.KntKarty LEFT OUTER JOIN
                      CDN.TraNag ON TrN_KntNumer = Knt_GIDNumer AND TrN_TrNTyp = 3
GROUP BY Knt_GIDNumer, Knt_Akronim, Knt_Nazwa1, Knt_Nazwa2, Knt_Nazwa3, 
                      Knt_KodP, Knt_Miasto, Knt_Ulica, Knt_Telefon1, Knt_NipE, 
                      Knt_FormaPl, Knt_LimitOkres
Czy to jest rozwiązanie optymalne, czy też można w lepszy sposób?

I przy okazji ulica ma jeszcze drugi wiersz, a nr NIP ma czasami jeszcze prefix np. PL0000000000 i wtedy nalezy dodac pole z prefiksem.

Awatar użytkownika
rgrobelny
Posty: 41
Rejestracja: 20 kwie 2008, 19:05
Rola: Administrator CDN XL
Wersja: 9.6

Re: SQL - data ostatniej sprzedaży

Post autor: rgrobelny »

Dodałem informacje o prefiksie NIP i dodatkowym polu adresu, a także informacje o osobach kontaktowych i teraz wygląda to tak:

Kod: Zaznacz cały

select

knt_akronim,
Nazwa=RTRIM(Knt_Nazwa1)+RTRIM(' '+Knt_Nazwa2)+RTRIM(' '+Knt_Nazwa3),
Miejscowosc=Knt_KodP+' '+Knt_Miasto,
RTRIM(Knt_Ulica+' '+Knt_Adres),
Knt_Telefon1,
LTRIM(Knt_NipPrefiks+' '+Knt_NipE),

   CASE
      WHEN Knt_FormaPl BETWEEN 10 AND 19 THEN 'gotówka'
      WHEN Knt_FormaPl BETWEEN 20 AND 29 THEN 'przelew'
   ELSE ''
   END,
Knt_LimitOkres,

Data=ISNULL(convert(varchar(11), dateadd(day, TrN_Data2, '18001228'), 120),'<xx.xx.20xx'),

Osoba1=RTRIM(KnS_Nazwa)
+
 CASE 
  WHEN KnS_Stanowisko IS NULL OR KnS_Stanowisko='' THEN ''
  ELSE ', '+KnS_Stanowisko
 END
+
 CASE 
  WHEN KnS_Telefon IS NULL OR KnS_Telefon='' THEN ''
  ELSE ', '+KnS_Telefon
 END
+
 CASE 
  WHEN KnS_TelefonK IS NULL OR KnS_TelefonK='' THEN ''
  ELSE ', '+KnS_TelefonK
 END
+
 CASE 
  WHEN KnS_EMail IS NULL OR KnS_EMail='' THEN ''
  ELSE ', '+KnS_EMail
 END

from cdn.kntkarty AS X

LEFT OUTER JOIN CDN.TraNag ON Trn_KntNumer = Knt_GIDNumer
LEFT OUTER JOIN CDN.KntOsoby ON KnS_KntNumer = Knt_GIDNumer

where {filtrSQL} and (TrN_Data2=
(select max(TrN_Data2) from CDN.TraNag WHERE X.Knt_GIDNumer = Trn_KntNumer and TrN_TrNTyp=3 group by Trn_KntNumer) OR TrN_Data2 IS NULL)

ORDER BY knt_akronim
W miejsce xx.xx.20xx wpisujemy datę do której maksymalnie sięga baza (w moim przypadku 01.01.2008).

Teraz spróbuję odpowiednio ułożyć te dane wysyłając wyniki zapytania do jakiegoś szablon w XML (tzn. np. dane wszystkich osób kontaktowych pod danymi kontrahenta - to samo planuję dla adresów wysyłkowych czy upustów). Może ktoś dysponuje jakimiś przykładowymi szablonami lub chociaż opisem ich konstruowania?

ODPOWIEDZ