Zapytanie dwa warunki - problem - jak to zrobić.

0

Mam zapytanie:

select * from grupa where nr_ewidencyjny = 0001 and KONIEC = (select max(koniec) from grupa where nr_ewidencyjny = 0001)

Działa ono poprawnie dla osóby z numerem ewidencyjnym 0001 i wyświetla mi rekord (umowę) z najstarsza datą ze wszystkich które były wcześniej i to jest ok.
Są jednak pracownicy którzy mają umowę na czas nieokreślony i dane w kolumnie "koniec" to pole jest puste.

Czy może ktoś pomóc mi zmodyfikować to zapytanie tak by:

Zapytanie sprawdzało czy dla określonego numeru ewidencyjnego istnieje wiersz gdzie wartość jest pusta i jeśli tak to ją pokaże. Jeśli nie ma takiej wartości działaj jak wyżej? Czyli połączyć to:

select * from grupa where nr_ewidencyjny = 0001 and koniec IS NULL

Ps
Rozwiązanie było by najszybsze gdyby pierwsze zapytanie pustą wartość we wierszu "koniec" traktowało jak wartość najwyższą i to ja pokazywało jednak tak nie potrafię tego zrobić.
dał by radę ktoś mi pomóc?

0

Jeśli chcesz zrobić jak mówisz, że pusty "koniec" jest traktowany jako najwieksza wartość, to poczytaj o CASE

0
select * from grupa where nr_ewidencyjny = 0001 and (KONIEC is null or KONIEC = (select max(koniec) from grupa where nr_ewidencyjny = 0001))
0
wemibo napisał(a):
select * from grupa where nr_ewidencyjny = 0001 and (KONIEC is null or KONIEC = (select max(koniec) from grupa where nr_ewidencyjny = 0001))

Dziekuję wemibo. 😀
Prawie dobrze ... jednak gdy puste wywala mi puste oraz najwższą wartość .... czyli dwa wiersze a potrzebuje 1 :/
Ten z pustym.

Nie wiem czy case sę tutaj przyda.

CASE wartość_lub_nazwa_kolumny WHEN wartość_1 THEN wynik_1 WHEN wartość_2 THEN wynik_2 WHEN wartość_n THEN wynik_n [ ELSE wynik_gdy_zaden_z_warunków_nie_jest_spełniony ] END

po naszemu - sprawdź czy wartość w polu jest pusta - jeśli tak - wyświetl wiersz z pustym jestli nie ma pustego wyświetl największą wartość z dostępnych

0
select * from grupa where nr_ewidencyjny = 0001 and isnull(koniec,'30001231') = (select max(isnull(koniec,'30001231')) from grupa where nr_ewidencyjny = 0001))

30001231 - koniec świata

select top 1 * from grupa where nr_ewidencyjny = 0001 and (KONIEC is null or KONIEC = (select max(koniec) from grupa where nr_ewidencyjny = 0001)) order by isnull(KONIEC,'30001231')
0
wemibo napisał(a):
select * from grupa where nr_ewidencyjny = 0001 and isnull(koniec,'30001231') = (select max(isnull(koniec,'30001231')) from grupa where nr_ewidencyjny = 0001))

30001231 - koniec świata

select top 1 * from grupa where nr_ewidencyjny = 0001 and (KONIEC is null or KONIEC = (select max(koniec) from grupa where nr_ewidencyjny = 0001)) order by isnull(KONIEC,'30001231')

Poecenie SQL niepoprawnie zakonczone ?:/

0
select * from grupa where nr_ewidencyjny = 1015 and is null(koniec,'30001231') = (select max(is null(koniec,'30001231')) from grupa where nr_ewidencyjny = 1015);

Skasowanie nawiasu wywaliło błąd isnull - poprawiłem na is null ale nawet wtedy mam kominikat "brak wyrażenia"

0

jaki to sql ? mój przyklad do sql server (microsoftowy)
poniżej testowy kod, który zwraca poprawnie 1 wiersz z nullowym końcem

create table #grupa
(nr_ewidencyjny varchar(100)
,koniec datetime)

insert into #grupa(nr_ewidencyjny, koniec) values ('0001', null)
insert into #grupa(nr_ewidencyjny, koniec) values ('0001', '20220101')

select * from #grupa where nr_ewidencyjny = 0001 and isnull(koniec,'30001231') = (select max(isnull(koniec,'30001231')) from #grupa where nr_ewidencyjny = 0001)

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