[SQL] Wyszukiwanie danych w jednej tabeli

Witam,

mam następujący problem.

Mam jedną tabelę w Accessie z danymi zawierającą następujące dane:

PESEL, Imię, Nazwisko, projekt, data_od_realizacji, data_do_realizacji

012345678910 Jan Kowalski Projekt1 12-01-2012 20-01-2012

012345678911 Marian Lewandowski Projekt2 12-01-2012 15-01-2012

012345678910 Jan Kowalski Projekt3 19-01-2012 22-01-2012

  1. Chciałbym znaleźć w tabeli czy w ciągu 30dni od realizacji ostatniego projekt (czyli na przykładzie 22-01-2012) był wykonywany inny wcześniejszy projekt (czyli 20.012012) dla tej samej osoby (czyli Kowlskiego).

  2. Chciałbym też mieć możliwość wyszukania czy projekt wykonywany dla danej osoby był realizowany w czasie realizacji innego projektu.

Szczerz mówiąc jest początkujący w SQL i nie mam koncepcji jak się za to zabrać.

Pozdrawiam

nie mam accessa ale pamiętam że do sprawdzania różnicy w datach była funkcja DateDiff

DateDiff(“d”,Data1, Data2) > 30 - spr czy różnica między datami jest większa niż 30dni.

interwał - d dzień, m miesiąc, itp

data1 - data początkowa

data2 - data końcowa

PESEL nie jest wartością unikalną. Jest możliwe, aby dwie osoby miały ten sam numer (choć jest to mało prawdopodobne).

Nazwy kolumny powinny zaczynać się od wielkiej litery.

Nazwy kolumn nie powinny zawierać znaków diakrytycznych (najlepiej jak będą angielskie).

AD 1.

SELECT t2.*

FROM (

	SELECT t.PESEL, MAX(t.data_do_realizacji) AS 'Max' FROM Dane AS t

	GROUP BY t.PESEL

) AS t1, Dane AS t2

WHERE DATEDIFF(d, t2.data_do_realizacji, t1.Max) <= 30

AND t1.PESEL = t2.PESEL;

AD 2.

Nie rozumiem. Jakiś przykład?

Kombinowałem coś z tym:

SELECT IMIĘ, NAZWISKO, PESEL, projekt, DATEDIFF("d", [data_od_realizacji], [data_do_realizacj]) as RÓZNICA

FROM tb1

Ale ten kod pokazuje mi różnicę w danym wierszu. A mi pokazywać różnicę między wierszem 1(20-01-2012) a 3(22-01-2012). Poszczególne osoby mają unikalne nr PESEL. 3. Sprawdzenie czy podczas realizacji projektu3 czyli w dniach 19-01-2012 22-01-2012, zostały wykonane Kowalskiemu inne projekty - tu w tabeli mam że projekt1 był zrealizowany w dniach 12-01-2012 20-01-2012. Czyli wspólny czas realizacji to 19.02.2012 - 20.02.2012

Rozumiem że “Dane” to moja nazwa tabeli?

Access pokazuje mi błąd przy próbie wykonania kwerendy: “Błąd składniowy brak operatora w wyrażeniu kwerendy MAX(t.data_do_realizacji)”

Hm, ja to zapytanie testowałem na MS SQL Server i tam działa. Jedyne co jest nietypowego w jego składni to funkcja DATEDIFF. Sęk w tym, że ona występuje w MS Access i wywołuje się ją w dokładnie ten sam sposób jak na MS SQL Server. Spróbuj samemu poprawić składnię tego zapytania (to musi być jakiś duperel). Jak sobie nie poradzisz to wtedy zainstaluję MS Access (w sumie zaraz się za to zabiorę) i sam to zrobię.

Zacznij od sprawdzenia, czy działa samo podzapytanie, tj.:

SELECT t.PESEL, MAX(t.data_do_realizacji) AS 'Max' FROM Dane AS t

GROUP BY t.PESEL

Działa.

SELECT t2.*

FROM (

   SELECT t.PESEL, MAX(t.data_do_realizacji) AS 'Max' FROM Dane AS t

   GROUP BY t.PESEL

) AS t1, Dane AS t2

WHERE DATEDIFF("d", t2.data_do_realizacji, t1.Max) <= 30

AND t1.PESEL = t2.PESEL;

Przy próbie wykonywanie kwerendy pokazuje się okienko i program chce żebym podał wartość parametru dla ‘Max’

Spróbuj zamienić DATEDIFF(d, t2.data_do_realizacji, t1.Max) na DATEDIFF(“d”, t2.data_do_realizacji, t1.Max) i uruchom wówczas całe zapytanie.

EDIT:

“Przy próbie wykonywanie kwerendy pokazuje się okienko i program chce żebym podał wartość parametru dla ‘Max’”

Rozumiem. No to są jakieś bzdury :slight_smile: Będę musiał zainstalować Access i sam na to spojrzeć. Rano napiszę Ci co jest nie tak i podam też kod SQL tego drugiego zapytania.

AD 1.

SELECT t2.*

FROM (

   SELECT t.PESEL, MAX(t.data_do_realizacji) AS Max 

   FROM Dane AS t

   GROUP BY t.PESEL

) AS t1, Dane AS t2

WHERE DATEDIFF("d", t2.data_do_realizacji, t1.Max) <= 30

AND t1.PESEL = t2.PESEL;

(problemem był cudzysłów - mówiłem, że warto popróbować samemu poprawić to zapytanie) AD 2.

SELECT t1.*, t2.projekt, t2.data_od_realizacji, t2.data_do_realizacji

FROM Dane AS t1, Dane AS t2

WHERE t1.PESEL = t2.PESEL

AND t1.projekt <> t2.projekt

AND t2.data_do_realizacji >= t1.data_od_realizacji AND t2.data_do_realizacji <= t1.data_do_realizacji;

Dziękuje bardzo za pomoc.

Problem mam jednak z pierwszą kwerendą, ponieważ otrzymuje w wyniku wykonania kwerendy wszystkie wiersze w bazie. A nie tylko te, których różnica w dacie koncie realizacji projektu jest większa niż 30, pomiędzy tymi samymi osobami.

Z tabeli z danymi

PESEL IMIE NAZWISKO PROJEKT DATA_REALIZACJI_OD DATA_REALIZACJI_DO

1234567890 JAN KOWALSKI PROJEKT1 2012-01-02 2012-01-09

1234567890 JAN KOWALSKI PROJEKT2 2012-04-03 2012-04-04

1234567899 MATEUSZ MROZINSKI PROJEKT3 2012-02-04 2012-02-09

45060800456 KAROL JANKOWSKI PROJEKT4 2012-03-01 2012-04-01

Otrzymuje:

PESEL IMIE NAZWISKO PROJEKT DATA_REALIZACJI_OD DATA_REALIZACJI_DO

1234567890 JAN KOWALSKI PROJEKT2 2012-04-03 2012-04-04

1234567899 MATEUSZ MROZINSKI PROJEKT3 2012-02-04 2012-02-09

45060800456 KAROL JANKOWSKI PROJEKT4 2012-03-01 2012-04-01

Druga kwerenda działa prawidłowo.

Zapytanie działa zgodnie z zamierzeniem. Początkowo mówiłeś, że różnica w dacie nie może przekroczyć 30 dni. Zapytanie działa tak, że dla każdej osoby w tabeli z projektami, wyszukuje najpierw maksymalną wartość w kolumnie DATA_REALIZACJI_DO, czyli będzie:

JAN KOWALSKI 2012-04-04

MATEUSZ MROZINSKI 2012-02-09

KAROL JANKOWSKI 2012-04-01

Następnie zapytanie dla każdej z tych osób wyszukuje, czy w przeciągu ostatnich 30 dni (licząc do maksymalnej wartości DATA_REALIZACJI_DO dla każdej z osób), nie zostały zakończone jakieś projekty, czyli:

dla Jana Kowalskiego będzie szukać projektów zakończonych w okresie od 2012-04-04 - 30 do 2012-04-04

dla Mateusza Mrozinskiego będzie szukać projektów zakończonych w okresie od 2012-02-09 - 30 do 2012-02-09

dla Karola Jankowskiego będzie szukać projektów zakończonych w okresie od 2012-04-01 - 30 do 2012-04-01

Jeśli nie takie wyniki Cię interesują, to podaj jakich wyników oczekujesz dla tych danych, a wprowadzę odpowiednie poprawki.