Połączenie dwóch tabel i pokazanie ostatniej daty.

0

Hej, mam dwie tabele transition_log i grdm.
Potrzebuje aby połączyć te dwie tabele i zrobić widok, który pokaże ostatnią date, id produktu, na kazdym z level_inv.

Te dwie tabele można połączyć za pomocą transition_log.status_from = GRDM.state_from and transition_log.status_to=GRDM.state_to

Transition log

DATE ID status_from status_to
5.10.2022 123456 Open In progress
20.01.2023 123456 Open Closed
24.05.2023 123456 In progress Closed
5.11.2023 123456 Assigned In progress
6.12.2023 123456 In progress Assigned

GRDM

LEVEL_INV Comment state_from state_to
L1 xxxxxxx Open In progress
L2 xxxxxxx Open Closed
L2 xxxxxxx In progress Closed
L1 xxxxxxx Assigned In progress
L1 xxxxxxx In progress Assigned

Rezultat

LEVEL_INV DATE ID status_from status_to
L1 6.12.2023 123456 In progress Assigned
L2 24.05.2023 123456 In progress Closed
Select GRDM.level_INV, MAX(TRL.DATE), TRL.ID, TRL.status,TRL.status_to 

FROM TRANSITION_LOG as TRL 

inner join GRDM on TRL.status_from=grdm.state_from and TRL.status_to=grdm.state_to 

group by LEVEL_INV, ID

Niestety taka kwerenda nie działa

0

Jak już próbowałeś to rozwiązać i co nie działa?

0

Select GRDM.level_INV, MAX(TRL.DATE), TRL.ID, TRL.status,TRL.status_to

FROM TRANSITION_LOG as TRL

inner join GRDM on TRL.status_from=grdm.state_from and TRL.status_to=grdm.state_to

group by LEVEL_INV, ID

taka kwerenda ale niestety do group by muszę dodać wszystkie inne kolumny, które muszę wybrać, a chce żeby inne dane się też wyswietłały

0

Najpierw wybierz interesujące cię id a potem dociągnij resztę danych

0

W jakim sensie ? ID ich będzie miliony i będą różne

0

A sprawdź czy to działa... od chatgpt

"Wygląda na to, że potrzebujesz skorygować kilka rzeczy w zapytaniu SQL. Przede wszystkim, musisz uwzględnić, że chcesz maksymalną datę dla każdego poziomu inwentarza i identyfikatora produktu. Tutaj jest poprawione zapytanie:

SELECT GRDM.LEVEL_INV, MAX(TRL.DATE) AS Last_Date, TRL.ID, TRL.status_from, TRL.status_to
FROM transition_log AS TRL
INNER JOIN grdm ON TRL.status_from = grdm.state_from AND TRL.status_to = grdm.state_to
GROUP BY GRDM.LEVEL_INV, TRL.ID;

To zapytanie powinno połączyć obie tabele i zwrócić maksymalną datę dla każdego poziomu inwentarza i identyfikatora produktu. Sprawdź, czy to działa dla Twojej bazy danych!"

2
biela_ napisał(a):

A sprawdź czy to działa... od chatgpt

"Wygląda na to, że potrzebujesz skorygować kilka rzeczy w zapytaniu SQL. Przede wszystkim, musisz uwzględnić, że chcesz maksymalną datę dla każdego poziomu inwentarza i identyfikatora produktu. Tutaj jest poprawione zapytanie:

SELECT GRDM.LEVEL_INV, MAX(TRL.DATE) AS Last_Date, TRL.ID, TRL.status_from, TRL.status_to
FROM transition_log AS TRL
INNER JOIN grdm ON TRL.status_from = grdm.state_from AND TRL.status_to = grdm.state_to
GROUP BY GRDM.LEVEL_INV, TRL.ID;

To zapytanie powinno połączyć obie tabele i zwrócić maksymalną datę dla każdego poziomu inwentarza i identyfikatora produktu. Sprawdź, czy to działa dla Twojej bazy danych!"

Twój post przywraca mi wiarę w to, że niekompetentni ludzie wyposażeni jedynie w AI nie zdobędą tego rynku tak szybko, jak się o tym mówi :)
Po pierwsze, OP z takim właśnie zapytaniem do nas przyszedł, po drugie, w MS SQL to nie zadziała - parser zwróci błąd.

Pytanie są następujące:
Czy Jednego dnia jeden dokument (czy co tam jest trzymane w grdm) może mieć kilka przejść statusów na tym samym level_inv? Co wówczas chcesz wyświetlić w ramach status_from i status_to? Losowy wpis, czy jest coś, co determinuje kolejność poza samą datą?

Bo jeśli nie ma opcji na dwa wpisy z jedną datą, to proponuję

SELECT LEVEL_INV
	,DATE
	,ID
	,STATUS_FROM
	,STATUS_TO 
FROM (
	SELECT GRDM.LEVEL_INV
		,TRL.DATE
		,TRL.ID
		,TRL.STATUS_FROM
		,TRL.STATUS_TO 
		,ROWNUM = ROW_NUMBER() OVER(PARTITION BY GRDM.LEVEL_INV,TRL.ID ORDER BY TRL.DATE DESC)
	FROM TRANSITION_LOG TRL 
	INNER JOIN GRDM 
		ON TRL.STATUS_FROM = GRDM.STATE_FROM 
		AND TRL.STATUS_TO = GRDM.STATE_TO
) X
WHERE ROWNUM = 1

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