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
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).
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ć.
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;
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
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 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;
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
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.