• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Brak wyników po zapytaniu.

Object Storage Arubacloud
0 głosów
342 wizyt
pytanie zadane 14 kwietnia 2020 w SQL, bazy danych przez KonDZIKs Bywalec (2,770 p.)

Witam.

Mam problem ,którego nie rozumiem. Chodzi o Having mam do zrobienia 2 zadania i oba zadania wykrzaczają się na tym samym błędzie. Co śmieszniejsze kod mojej koleżanki jest wręcz identyczny do mojego a jej wszystko działa... I ona tez nie wie co może być przyczyną.
Zad 1
Przygotowac: nazwisko, imię i numer Pesel, datę urodzenia  pacjenta oraz  liczbę wizyt w lekarza rodzinnego w I półroczu 2013. W wyniku uwzględniamy tylko tych pacjentów, którzy byli w podanym okresie na więcej niż 3 wizytach. Wynik uporządkować według liczby wizyt, a w obrębie tej samej ilości wizyt uporządkować alfabetycznie według nazwiska.

Select p.Imie, p.Nazwisko, p.Pesel, p.DataUrodzenia, w.DataWizyty, s.NazwaSpecjalizacji,
	count(w.IdPacjenta) as IloscWizyt,
	rank() over (order by P.Nazwisko desc) as rk
From Pacjenci as P join Wizyty as W
	on p.idPacjenta = w.idPacjenta
	join Lekarze as L
	on w.IdLekarza = l.IdLekarza
	join Specjalizacje as S
	on s.idspecjalizacji = l.Idspecjalizacji
Where DataWizyty between '20130101' and '20130630' and NazwaSpecjalizacji = 'lekarz rodzinny'
Group by p.Imie, p.Nazwisko, p.Pesel, p.DataUrodzenia, w.DataWizyty, s.NazwaSpecjalizacji
Having count(*) > 3

Zad 2

Napisać zapytanie, które zwraca następujące dane; nazwisko, imię, Pesel oraz średnią ocen z roku 2013 dla studentów urodzonych po roku 1966. Uwzględniamy tylko tych studentów, którzy w roku 2013 otrzymali więcej niż 20 ocen. Wynik uporządkować malejąco według średniej ocen.

SELECT s.Nazwisko, s.Imie, s.Pesel,o.DataOceny,s.DataUrodzenia,
                avg(o.ocena) over () AS Srednia,
                count(o.ocena) AS IleOcenS
FROM Studenci AS S JOIN Oceny AS O
        ON s.IdStudenta = o.IdStudenta
WHERE year(DataUrodzenia) > 1966 AND  year(DataOceny) = 2013
GROUP BY s.Nazwisko, s.Imie, s.Pesel,o.DataOceny,s.DataUrodzenia,o.ocena
HAVING count(o.ocena) >20
order by avg(o.ocena) desc

Ja wiem ,że having jest do filtrowania grup. Ale jakoś go nie rozumiem. Nie wiem dlaczego mi to nie działa...

Dziękuję za wszelkie odpowiedzi.

komentarz 14 kwietnia 2020 przez bwaluk Mądrala (5,440 p.)
edycja 14 kwietnia 2020 przez bwaluk
A jaki błąd masz? Jaka wersja bazy danych?
komentarz 16 kwietnia 2020 przez KonDZIKs Bywalec (2,770 p.)
Tzn to nie jest konkretny błąd. Ten kod działa do momentu gdy nie zaznaczę having wyświetla tablicę z danymi lecz gdy zaznaczę having to nagle jest pusta tablica i dzieje się to w obydwu przypadkach. Używam Microsoft SQL Server Management Studio 18 (jeżeli o to chodzi)

1 odpowiedź

0 głosów
odpowiedź 17 kwietnia 2020 przez bwaluk Mądrala (5,440 p.)
wybrane 18 kwietnia 2020 przez KonDZIKs
 
Najlepsza

W zadaniu pierwszym jest błąd - nadmiarowo wyciągasz dane i ograniczasz sobie możliwość grupowania. Grupowanie po dacie wizyty powoduje zliczanie dla tej konkretnej daty, a miałeś pokazać liczbę wizyt w całym półroczu. Druga rzecz - masz posortować dane, a używasz mechanizmu rankingu (to nie jest to samo, zwykły order po dwóch polach wystarczy). 

Tak spróbuj (nie odpalałem, mam nadzieję, że nie ma literówek):

SELECT 
     p.nazwisko
    ,p.imie  
    ,p.pesel
    ,p.dataurodzenia
    ,Count(p.idpacjenta) AS IloscWizyt
FROM pacjenci AS p 
JOIN wizyty AS w ON p.idpacjenta = w.idpacjenta 
JOIN lekarze AS l ON w.idlekarza = l.idlekarza 
JOIN specjalizacje AS s ON s.idspecjalizacji = l.idspecjalizacji 
WHERE 
        w.datawizyty BETWEEN '20130101' AND '20130630' 
    AND nazwaspecjalizacji = 'lekarz rodzinny' 
GROUP BY 
     p.imie
    ,p.nazwisko
    ,p.pesel
    ,p.dataurodzenia
HAVING Count(p.idpacjenta) > 3 
ORDER BY IloscWizyt, p.nazwisko

W zadaniu drugim ponownie nadmiarowo wyciągasz dane (PAMIĘTAJ - grupujesz tylko pola, które występują w select bez działań matematycznych)
 

SELECT 
     s.nazwisko
    ,s.imie
    ,s.pesel
    ,Avg(o.ocena) AS Srednia
FROM studenci AS s
JOIN oceny AS o ON s.idstudenta = o.idstudenta
WHERE 
        Year(dataurodzenia) > 1966
    AND Year(dataoceny) = 2013
GROUP BY 
     s.nazwisko
    ,s.imie
    ,s.pesel
HAVING Count(o.ocena) > 20
ORDER BY Srednia DESC 


 

komentarz 18 kwietnia 2020 przez KonDZIKs Bywalec (2,770 p.)
Tak działają. Dziękuję bardzo. Wypisałem te pola aby sprawdzić, czy poprawnie filtruje po where i ich nie usuwałem. Teraz już wiem. Dziękuję jeszcze raz
komentarz 18 kwietnia 2020 przez KonDZIKs Bywalec (2,770 p.)

Jeszcze jedno pytanie bym miał. Do zadnia nr 3 (dodatkowe). Napiszę w oddzielnym komentarzu zeby było przejrzyście.

Napisać zapytanie, które zwróci dane pacjentek urodzonych po roku 1965; nazwisko, imię i pesel, które w roku 2013 miały przynajmniej trzy wizyty u lekarza rodzinnego i przynajmniej 3 wizyty u innych specjalistów.

Zapytania zrobiłem oddzielnie jedno dla lekarza rodzinnego a drugie dla reszty z użyciem with. Problem polega na tym ,że wyrzuca tutaj dziwny błąd.

Msg 156, Level 15, State 1, Line 177
Incorrect syntax near the keyword 'With'.
Msg 319, Level 15, State 1, Line 177
Incorrect syntax near the keyword 'with'. If this statement is a common table expression, an xmlnamespaces clause or a change tracking context clause, the previous statement must be terminated with a semicolon.

I nie mogę wypisać obydwu na raz.

Kod:

With DaneLR as
(
SELECT p.Nazwisko, p.Imie, p.Pesel,
	count(w.IdPacjenta) as IlosWizyt
FROM Pacjenci as P join Wizyty as W
ON P.IdPacjenta = W.IdPacjenta
JOIN Lekarze as L
ON w.IdLekarza = L.IdLekarza
JOIN Specjalizacje as S
ON s.idspecjalizacji = l.Idspecjalizacji
WHERE p.CzyKobieta = 1 and year(p.DataUrodzenia) > 1965 and year(w.DataWizyty) = 2013 and s.idspecjalizacji = 1
GROUP BY p.Nazwisko, p.Imie, p.Pesel
HAVING count(w.IdPacjenta) > 3
),

With DaneWLR as
(
SELECT p.Nazwisko, p.Imie, p.Pesel,
	count(w.IdPacjenta) as IlosWizyt
FROM Pacjenci as P join Wizyty as W
ON P.IdPacjenta = W.IdPacjenta
JOIN Lekarze as L
ON w.IdLekarza = L.IdLekarza
JOIN Specjalizacje as S
ON s.idspecjalizacji = l.Idspecjalizacji
WHERE p.CzyKobieta = 1 and year(p.DataUrodzenia) > 1965 and year(w.DataWizyty) = 2013 and s.idspecjalizacji != 1 
GROUP BY p.Nazwisko, p.Imie, p.Pesel
HAVING count(w.IdPacjenta) > 3
)

Select *
FROM DaneLR, DaneWLR
Where DaneWLR.IlosWizyt > 3 and DaneLR.IloscWizyt >3

 

komentarz 19 kwietnia 2020 przez bwaluk Mądrala (5,440 p.)
Można to napisać prościej, ale jak już użyłeś WITH to wywal słowo WITH z 16 wiersza i powinno działać (ale dane będą niepoprawne, bo zwróci Ci je zupełnie od siebie odseparowane). W ostatnim Select musisz te tabele ze sobą zjoinować (a wcześniej użyj poprawnych warunków, bo w zadaniu masz pokazać wizyty w liczbie przynajmniej 3, a nie większe od 3).

Podobne pytania

0 głosów
2 odpowiedzi 321 wizyt
pytanie zadane 1 lutego 2017 w SQL, bazy danych przez loleq-polo Nowicjusz (150 p.)
0 głosów
1 odpowiedź 234 wizyt
0 głosów
1 odpowiedź 363 wizyt
pytanie zadane 22 stycznia 2023 w SQL, bazy danych przez gatka84 Bywalec (2,150 p.)

92,539 zapytań

141,382 odpowiedzi

319,481 komentarzy

61,928 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...