Zapytanie

0

Dzień dobry,
Mam gorącą prośbę o pomoc w konstrukcji zapytania. Mam takie trzy tabele:
T1
screenshot-20200729073939.png

T2
screenshot-20200729074004.png

T3
screenshot-20200729074023.png

Chciałbym uzyskać taki rezultat:
screenshot-20200729074307.png

O ile za pierwszą częścią zapytania sobie poradziłem, czyli powiązanie dokumentu z nabywcą, o tyle druga część już mi nastręcza trochę kłopotów. Pomoże ktoś?

1

Nie widzę tego zapytania

0
SELECT dok_Nr, dok_DataW,, dok_DataS, adr_NIP, adr_Nazwa, adr_Adres, adr_Kod, adr_Miejscowosc
FROM T1 INNER JOIN T2 ON (T1.dok_NabId = T2.adr_NabId)
ORDER BY T1.dok_DataW;
0

Ale co ty chcesz dostać: pierwszy rekord powiązany z dokumentem czy sumę wszystkich rekordów powiązanych z dokumentem?

1

@Buster: Musisz jeszcze zrobic JOIN do T3 za pomocą vt_DokId i w where dać filtrowanie po vt_VatId = 1, chyba, że masz gdzieś tabelke z tymi vat'ami

0

Zauważcie, że jeśli na dokumencie są produkty w dwóch różnych stawkach VAT, to wtedy w tabeli T3, mam dwa rekordy dla tego dokumentu. Natomiast ja bym chciał uzyskać te dane z tych dwóch rekordów, w jednym wyniku, w tym samym wierszu co ten konkretny dokument. Czy to w ogóle realne? Myślę, że tak. Tylko nie za bardzo wiem jak to zrobić.

3

Tak na szybko pisane mogą być literówki itp. Ale koncept powinien dać Ci co oczekujesz:

SELECT dok_Nr, dok_DataW,, dok_DataS, adr_NIP, adr_Nazwa, adr_Adres, adr_Kod, adr_Miejscowosc, 
SUM(CASE t3.vt_VatProc = 23 THEN vt_WartNetto ELSE 0 END) Netto23,
SUM(CASE t3.vt_VatProc = 23 THEN vt_WartVat ELSE 0 END) VAT23,
SUM(CASE t3.vt_VatProc = 8 THEN vt_WartNetto ELSE 0 END) Netto8,
SUM(CASE t3.vt_VatProc = 8 THEN vt_WartVat ELSE 0 END) VAT8

FROM T1 
INNER JOIN T2
ON (T1.dok_NabId = T2.adr_NabId)
LEFT JOIN T3
ON T1.dok_ID = T3.vt_DokID
GROUP BY dok_Nr, dok_DataW,, dok_DataS, adr_NIP, adr_Nazwa, adr_Adres, adr_Kod, adr_Miejscowosc
ORDER BY T1.dok_DataW;

0

Ok. Już sobie poradziłem, bez żadnych PIVOT-ów. Normalne zapytanie SQL. Nie rozumiem, dlaczego doszukiwaliście się jakiś komplikacji. Normalne LEFT JOIN pomiędzy tabelami T1 i T3. Specjalnie załączyłem przykład, co bym chciał osiągnąć. Zapytanie zrobione, działa.

0
SELECT dok_NrPelny, dok_DataWyst, dok_DoDokDataWyst, adr_NIP, adr_NazwaPelna, adr_Adres, adr_Kod, adr_Miejscowosc, 
[Netto23] = ISNULL(V23.vt_WartNetto,0), 
[Vat23] = ISNULL(V23.vt_WartVat,0), 
[Netto8] = ISNULL(V8.vt_WartNetto,0), 
[Vat8] = ISNULL(V8.vt_WartVat,0) 
FROM dok__Dokument D INNER JOIN adr__Ewid E ON (D.dok_PlatnikId = E.adr_IdObiektu) 
	INNER JOIN dok_Vat V ON (V.vt_DokId = D.dok_Id) 
	LEFT JOIN dok_Vat V23 ON (D.dok_Id = V23.vt_DokId AND V23.vt_VatProc = 23) 
	LEFT JOIN dok_Vat V8 ON (D.dok_Id = V8.vt_DokId AND V8.vt_VatProc = 8) 
WHERE adr_TypAdresu = 1 AND (D.dok_Typ = 2 OR D.dok_Typ = 6) AND D.dok_Status <> 2 AND D.dok_DataWyst BETWEEN '2020-07-01' AND '2020-07-31' 
GROUP BY dok_NrPelny, dok_DataWyst, dok_DoDokDataWyst, adr_NIP, adr_NazwaPelna, adr_Adres, adr_Kod, adr_Miejscowosc, V23.vt_WartNetto, V23.vt_WartVat, V8.vt_WartNetto, V8.vt_WartVat
ORDER BY D.dok_DataWyst, D.dok_NrPelny;
0

Taa można ... tylko po co ? Przeanalizuj sobie ten artykuł który porównuje 3 metody by osiągnąć to samo i sprawdza który jest najoptymalniejszy - bo chyba to idealna odpowiedź na ten wątek i tą dyskusję:
https://pl.seequality.net/pivot-tsql-metody/

Ps. Dla tych co nie będą czytać o dziwo PIVOT nie jest najoptymalniejszy :) Przynajmniej w tym konkretnym przykładzie (to tak a propos Twojego komentarza @Fac)

1 użytkowników online, w tym zalogowanych: 0, gości: 1