Strona 1 z 1

SQL - data ostatniej sprzedaży

: 15 maja 2008, 15:39
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')

Re: SQL - data ostatniej sprzedaży

: 15 maja 2008, 15:45
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ł ;)

Re: SQL - data ostatniej sprzedaży

: 15 maja 2008, 16:28
autor: rgrobelny
Piękne dzięki za naprowadzenie :D

Re: SQL - data ostatniej sprzedaży

: 15 maja 2008, 21:16
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.

Re: SQL - data ostatniej sprzedaży

: 16 maja 2008, 09:06
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?