SQL SERVER PC market ostatnia cena zakupu, dostawca POMOC

0

Witam.
Potrzebuje zrobić raport w sql server menagment do programu pc market.
Raport ma posiadać informacje:
ostatnia cena zakupu, dostawce, rotacje, stan, kod kreskowy oraz nazwe indeksu.

Dane trzeba wyciągnąc z trzech tabel.
Próbowałem coś zrobić lecz wyskakują mi tylko ostatnie daty dokumentu z danego dnia. Muszę miec ostatnia cene, dostawce do kazdego indeksu, który był zamawiany. Wyskakuja tylko pozycje ktore były zamawiane w ostatnim dniu dostaw.

SELECT Dok.Data, Dok.NrDok, PozDok.CenaDet, PozDok.IloscPlus, Towar.Nazwa, towar.Kod
FROM Dok
LEFT OUTER JOIN dbo.PozDok on PozDok.DokId=Dok.DokId
INNER JOIN dbo.Towar on Towar.TowId=PozDok.TowId
where NrDok Like 'PZ%' and Dok.Data = ( SELECT MAX( Dok.Data ) FROM Dok
WHERE Towar.TowId = PozDok.TowId )

0

Przy założeniu, że masz w kolumnie [Data] typ danych DateTime to Twój kod można poprawić np. tak (jeśli typ danych tylko date to możesz mieć kilka zamówień tego samego dnia):

WITH OstatniDok as
(SELECT MAX(d.Data) OstData, pd.TowId
FROM dbo.Dok d
JOIN dbo.PozDok pd
ON d.DokId= pd.DokId
GROUP BY pd.TowId
)

SELECT d.Data, d.NrDok, pd.CenaDet, pd.IloscPlus, t.Nazwa, t.Kod
FROM dbo.Dok d
JOIN OstatniDok od
     ON d.Data = od.OstData
JOIN dbo.PozDok pd
     ON d.DokId= pd.DokId
JOIN dbo.Towar t 
    ON t.TowId=pd.TowId
WHERE d.NrDok Like 'PZ%'

0

@BlackBad: Dzięki za odpowiedź.
Niestety nie pomogło.
Powtarzają się nazwy i ilości na pojedyńczym dokumencie.
2020-08-12 0000.000 PZ/12/10 21.1382 1.0000 Wódka Wyborowa 4801
2020-08-12 0000.000 PZ/12/10 21.1382 1.0000 Wódka Wyborowa 4801
2020-08-12 0000.000 PZ/12/10 21.1382 1.0000 Wódka Wyborowa 4801
2020-08-12 0000.000 PZ/12/10 21.1382 1.0000 Wódka Wyborowa 4801
2020-08-12 0000.000 PZ/12/10 21.1382 1.0000 Wódka Wyborowa 4801
2020-08-12 0000.000 PZ/12/10 21.1382 1.0000 Wódka Wyborowa 4801
2020-08-12 0000.000 PZ/12/10 21.1382 1.0000 Wódka Wyborowa 4801
2020-08-12 0000.000 PZ/12/10 21.1382 1.0000 Wódka Wyborowa 4801
2020-08-05 0000.000 PZ/12/11 1.3415 4.0000 AL grape 2L 1038
2020-11-15 0000.000 PZ/20/17 1.0000 1.0000 AL grape 2L 1038
2020-11-15 0000.000 PZ/20/17 1.0000 1.0000 AL grape 2L 1038
Typ danych jest datetime.

Przy tym założeniu:
SELECT Dok.Data, Dok.NrDok, PozDok.CenaDet, PozDok.IloscPlus, Towar.Nazwa, towar.Kod, Kontrahent.Nazwa, DokKontr.KontrId
FROM Dok
LEFT OUTER JOIN dbo.PozDok on PozDok.DokId=Dok.DokId
INNER JOIN dbo.Towar on Towar.TowId=PozDok.TowId
INNER JOIN dbo.DokKontr on DokKontr.DokId=Dok.DokId
INNER JOIN dbo.Kontrahent on Kontrahent.KontrId=DokKontr.KontrId
where NrDok Like 'PZ%'
2020-08-12 0000.000 PZ/17/16 1.3415 200.0000 AL grape 1.5L 5900835950226 SONRA
2020-08-12 0000.000 PZ/17/16 1.3415 200.0000 Al pomar 1.5l 5900835950028 SONRA
2020-08-12 0000.000 PZ/17/16 0.8537 100.0000 Baton Lion 45g. 5900090003965 SONRA
2020-08-12 0000.000 PZ/17/16 1.1789 100.0000 Baton Mars 58g. 5900951000997 SONRA
2020-08-12 0000.000 PZ/17/16 1.1951 100.0000 Baton Snikers 60g. 59006336 SONRA
2020-08-12 0000.000 PZ/17/16 0.7967 50.0000 Baton Picnic 50g 5901588023069 SONRA
2020-08-12 0000.000 PZ/17/16 4.0569 200.0000 Coca Cola 2L 5449000000286 SONRA
2020-08-12 0000.000 PZ/17/16 1.2114 100.0000 Coca Cola pusz 0.33L 5449000000996 SONRA
2020-11-15 0000.000 PZ/20/17 14.3704 1.0000 Wędzonka Pszczyńska 159 TOMEK
2020-11-15 0000.000 PZ/20/17 1.0000 1.0000 AL grape 2L 1038 TOMEK
2020-11-16 0000.000 PZ/20/18 0.7480 1.0000 Baton Mars 58g. 5900951000997 ZUZI FIRMA HANDLOWA s.c.
2020-11-16 0000.000 PZ/20/19 2.4352 1.0000 Kiełbasa Alberger 166 ZUZI FIRMA HANDLOWA s.c.
2020-11-16 0000.000 PZ/20/19 0.9074 1.0000 Kawa Zbożowa ex 90g 5900983014177 ZUZI FIRMA HANDLOWA s.c.
2020-11-20 0000.000 PZ/20/20 1.2195 1.0000 AL grape 1.5L 5900835950226 ZUZI FIRMA HANDLOWA s.c.
2020-11-20 0000.000 PZ/20/20 1.3415 15.0000 Al pomar 1.5l 5900835950028 ZUZI FIRMA HANDLOWA s.c.
2020-11-20 0000.000 PZ/20/21 14.7480 13.0000 Almondo luz cuk 1503 TOR-GROCH-FIL

Raport pokazuje wszystkie towary, które były wprowadzone dokumentem PZ.
A zależy mi na tym by pokazał towary z ostatnią ceną zakupu z ostatniego dokumentu.
Podam ci przykład:
Jest towar Al grape 1,5l, był kupywany 3 razy w ciągu miesiąca.
Raport pokazuje mi 2 zakupy, jedna data 2020-08-12, 2020-11-20,
a zależy mi na tym by brał pod uwagę cenę zakupu z ostatniego dokumentu. czyi 2020-11-20
Gdy dodam Dok.Data = ( SELECT MAX( Dok.Data ) FROM Dok
WHERE Towar.TowId = PozDok.TowId ) to raport pokazuje mi towary które były wprowadzane PZ wyłącznie w ostatnim dniu. Czyli jak były dzisiaj jakieś dwie PZ wprowadzone to wykaże nam tylko dwie pz, i wszystkie towary wprowadzone w nich. A towary które były kupywane miesiac temu, naprzyklad wino istra nie pokaze nam w raporcie.

Masz jakiś pomysł?

1

nie znam struktur programu, ale mniej więcej będzie coś takiego - tylko nie wiem gdzie jest zapisany stan artykułu:

select x.data, x.nrdok, x.cenadet ostatnia_cena, t.nazwa, t.kod
from towar t cross apply (select top 1 d.data, d.nrdok, pd.cenadet from dok d inner join pozdok pd on (d.dokid=pd.dkid) 
where pd.towid=t.towid and substring(d.nrdok, 1, 2)='pz' order by d.data desc, d.dokid desc) x
0

@Paweł Dmitruk: Super, działa :))) Dzieki:)
Stan towaru jest zapisany w tabeli Istw (stan), którą można połączyc z tabela towar.towid=Istw.towid
Mam jeszcze jedną prośbę, potrzebuje do powyzszej analizy nazwę dostawcy do danego indeksu.
Nazwa dostawcy jest w tabeli kontrahent.Nazwa probuje polaczyc to z tabela DokKontr.Kontrld która połączę z dok.dokld.
Połączenie wygladały by tak:
kontrahent.kontrld=dokkontr.kontrld, dokkontr.dokld=dok.dokld
Próbowałem to zrobic z inner join nie wychodziło...

0
select x.data, x.nrdok, x.cenadet ostatnia_cena, x.dostawca ostatni_dostawca, t.nazwa, t.kod
from towar t cross apply (select top 1 d.data, d.nrdok, pd.cenadet, k.nazwa dostawca from dok d inner join pozdok pd on (d.dokid=pd.dkid) 
inner join dokkontr dk on (d.dokid=d.dokid) inner join kontrahent k on (dk.kontrid=k.kontrid)
where pd.towid=t.towid and substring(d.nrdok, 1, 2)='pz' order by d.data desc, d.dokid desc) x
0

Taki raport się stworzył, niestety dostawce jednego przypisało do wszystkich pz.

2020-11-20 0000.000 PZ/20/21 14.7480 AGENCJA MARKETINGOWA Almondo luz cuk 1503
2020-08-06 0000.000 PZ/12/12 0.4630 AGENCJA MARKETINGOWA Aromaty do Ciast 10.8g 1610
2020-08-12 0000.000 PZ/17/16 4.0569 AGENCJA MARKETINGOWA Coca Cola 2L 5449000000286
2020-08-12 0000.000 PZ/17/16 2.5556 AGENCJA MARKETINGOWA Aqua 2L 1822
2020-08-12 0000.000 PZ/17/16 0.7967 AGENCJA MARKETINGOWA Baton Picnic 50g 5901588023069
2020-08-07 0000.000 PZ/12/14 2.7037 AGENCJA MARKETINGOWA Biszkopt San 180g 5901277070107
2020-08-05 0000.000 PZ/12/11 3.7236 AGENCJA MARKETINGOWA Andruty Kakao 280g Olza 5901480010235
2020-11-20 0000.000 PZ/20/20 1.3415 AGENCJA MARKETINGOWA Al pomar 1.5l 5900835950028
2020-11-29 0000.000 PZ/20/24 1.0650 AGENCJA MARKETINGOWA AL grape 1.5L 5900835950226
2020-08-12 0000.000 PZ/12/10 21.1382 AGENCJA MARKETINGOWA Wódka Wyborowa 4801
2020-11-15 0000.000 PZ/20/17 1.0000 AGENCJA MARKETINGOWA AL grape 2L 1038

0

dk on (d.dokid=d.dokid) zamiast d powinno byc dk
Dzieki Paweł

0

@Paweł Dmitruk:
Mam prośbe jeszcze co do stanu towaru, wyskakuje mi błąd ze nie może wyszukac x.stanmag. Stan towaru jest w tabeli Istw StanMag. Można połączyc poprzez MagId badz towId (towar.towid=istw.towid lub dok.magid=istw.magid).
Próbe zrobiłem na magid i towid niestety nie wychodzi mi.....;/

select x.data, x.nrdok, x.cenadet ostatnia_cena, x.dostawca ostatni_dostawca, x.stanmag, t.nazwa, t.kod
from towar t cross apply (select top 1 d.data, d.nrdok, pd.cenadet, k.nazwa dostawca, istw.StanMag stanmag from dok d inner join pozdok pd on (d.dokid=pd.DokId) 
inner join dokkontr dk on (dk.dokid=d.dokid) inner join kontrahent k on (dk.kontrid=k.kontrid) inner join Istw S on (S.MagId=D.MagId)
where pd.towid=t.towid and substring(d.nrdok, 1, 2)='pz' order by d.data desc, d.dokid desc) x```sql
1

Nie znam bazy, ale wg mnie MagId to raczej id_magazynu, więc takie połączenie opada ponieważ w jednym magazynie może być więcej niż jeden artykuł. Wg mnie powinno być to mniej-więcej tak:

select x.data, x.nrdok, x.cenadet ostatnia_cena, x.dostawca ostatni_dostawca, t.nazwa, t.kod, s.stanmag
from towar t left join istw s on (t.towid=s.towid) cross apply (select top 1 d.data, d.nrdok, pd.cenadet, k.nazwa dostawca 
from dok d inner join pozdok pd on (d.dokid=pd.dkid) 
inner join dokkontr dk on (d.dokid=dk.dokid) inner join kontrahent k on (dk.kontrid=k.kontrid)
where pd.towid=t.towid and substring(d.nrdok, 1, 2)='pz' order by d.data desc, d.dokid desc) x

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