Podzapytanie - jak to zrobić

Podzapytanie - jak to zrobić
PD
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 7
0

Witam Szanownych gości

Mam pewien deficyt wiedzy, jak to zrobić....

Poniżej jest pewien sql, który działa ale brakuje mi pewnej rzeczy. SQL generuje poniższe zestawienie:

screenshot-20251117132127.png
Na powyższym screenie, pierwszy rekord zawiera informację o "IloscOperacji", czyli wiem, że przynajmniej 3 razy dany kod przeszedł przez magazyn (zapewne raz został przyjęty, potem wydany i znów przyjęty). Jest to generalnie zestawienie generujące stany magazynowe. W ostatniej kolumnie jest data ostatniej operacji / ruchu magazynowego.

Pytanie brzmi, jak dopisać kod, który obok daty ostatniej operacji dodać magazyn, na którym się to zadziało... Magazyn niekoniecznie jest taki sam, bo towar mógł wejść innym i wyjść innym - rzecz jasna. Brakuje mi tylko pola, które pobierało by dane z rekordu, w którym znajduje się ostatnia data operacji.

Mam nadzieję, że to co napisałem, jest zrozumiałe. Bardzo wielka prośba o pomoc.

Kopiuj
SELECT T.KodKreskowy, Count(T.KodKreskowy) AS IloscOperacji, Sum(T.Ilosc) AS Stan, (
SELECT Max(D.DataT)
FROM tblTransfery AS D
WHERE (((D.RodzajT)='TZ')) and D.KodKreskowy = T.KodKreskowy
GROUP BY D.KodKreskowy
) AS DataWyj,
FROM tblTransfery AS T
WHERE (((T.RodzajT)=('TZ')))
GROUP BY T.KodKreskowy
HAVING (((Sum(T.Ilosc))>0))
ORDER BY T.KodKreskowy;
TR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 119
1

Masz kilka możliwości
Nie wiem jednego, ale zakładam, że pole 'Magazyn' masz w tabeli 'Transfery', spróbuj:

Kopiuj
SELECT T.KodKreskowy, Count(T.KodKreskowy) AS IloscOperacji, Sum(T.Ilosc) AS Stan, 
(SELECT Max(D.DataT) FROM tblTransfery AS D WHERE (((D.RodzajT)='TZ')) and D.KodKreskowy = T.KodKreskowy GROUP BY D.KodKreskowy) AS DataWyj,
(SELECT E.MAGAZYN FROM tblTransfery AS E WHERE (((E.RodzajT)='TZ')) and E.KodKreskowy = T.KodKreskowy AND E.DataT = D.DataT GROUP BY D.KodKreskowy) AS MAGAZYN
FROM tblTransfery AS T
WHERE (((T.RodzajT)=('TZ')))
GROUP BY T.KodKreskowy
HAVING (((Sum(T.Ilosc))>0))
ORDER BY T.KodKreskowy;

ps to możemy zignotrować, jak słusznie zauważyłem Kolega @Fac niżej, może wystąpić sytuacja gdzie 2 rekordy mają tę samą datę, wtedy moja propozycja nie zadziała.

FA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 218
1

Teoretycznie można też tak (powinno być mniej odczytów, niż przy dwóch osobnych subselektach) :

Kopiuj
SELECT T.KodKreskowy, Count(T.KodKreskowy) AS IloscOperacji, Sum(T.Ilosc) AS Stan,
  ot.DataT AS DataWyj, ot.Magazyn
FROM tblTransfery AS T
OUTER APPLY (
  SELECT TOP 1 DataT, Magazyn
  FROM tblTransfery ot
  WHERE ot.KodKreskowy = t.KodKreskowy
    AND ot.RodzajT='TZ'
  ORDER BY ot.DataT DESC
) ostTransfer
WHERE T.RodzajT = 'TZ'
GROUP BY T.KodKreskowy
HAVING Sum(T.Ilosc) > 0
ORDER BY T.KodKreskowy;

W tblTransfery.DataT trzymasz samą datę, czy również i czas?
Bo jeśli samą datę, to co byś chciał otrzymać w wyniku, jeśli w ostatnim dniu ten sam kod kreskowy był zarejestrowany w dwóch różnych magazynach?

PD
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 7
0
Fac napisał(a):

W tblTransfery.DataT trzymasz samą datę, czy również i czas?
Bo jeśli samą datę, to co byś chciał otrzymać w wyniku, jeśli w ostatnim dniu ten sam kod kreskowy był zarejestrowany w dwóch różnych magazynach?

W polu "DataT" - jest tylko data - bez czasu. Jest to celowe działanie, ze względu na specyfikę towaru, który nieprzechodzi z magazynu na magazyn praktycznie w tym samym dniu, dlatego jest ok

Mam jeszcze jedno pytanie, jak to zrobić, jak access nie ma "outer apply" ?

Bardzo dziękuję wszystkim za odpowiedzi - super info :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.