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')
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ł
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.
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?