Mam problem ze stworzeniem odpowiedniego zapytania w SQL. Pracuję na tabeli, która ma trzy kolumny - ID pacjenta, ID lekarza oraz datę wizyty lekarskiej. Muszę stworzyć zapytanie, które zliczy, u ilu lekarzy leczył się dany pacjent (czyli zwróci mi w jednym rekordzie ID_pacjenta oraz ilość lekarzy). Głowię się nad tym i nie mogę uzyskać odpowiedniego wyniku. Z góry dziękuję za pomoc. Pozdrawiam :)
Wyślij mi ten plik, wrzucę sobie do bazy i coś pokombinuje: prasol MAŁPA o2.pl
A może coś takiego: SELECT ID_pacjenta, COUNT(ID_lekarza FROM tabela GROUP BY Id_pacjenta.
Pewnie są jakieś błędy w syntaxie, ale pokombinuj.
Wysłałem maila z bazą.
Z pewnością to się da jakoś zrobić w jednym zapytaniu - inaczej komisja egzaminacyjna nie dałaby takiego zadania na maturze. Niemniej moja wiedza o SQLu jest chyba za mała, żeby sprostać tej części zadania :/
SELECT COUNT(*) FROM nazwa_tabeli WHERE ID_pacjenta = 6 - tym zapytaniem wyciągniesz liczbę ilu lekarzy leczyło pacjenta z ID = 6.
Z którego roku to jest pytanie? Zobaczyłbym jak wygląda cały arkusz. Tak z ciekawości.
Tym zapytaniem niestety otrzymam liczbę wszystkich wizyt (w tym wizyt u tego samego lekarza). Poza tym potrzebuję wykaz wszystkich pacjentów, a nie tylko jednego :/
http://www.cke.edu.pl/images/stories/Arkusze_matura_09/informatyka/PR/PR_2.pdf
Czyli wynikiem ma być:
- ID_pacjenta, liczba lekarzy u których się leczył
- ID_pacjenta, liczba lekarzy u których się leczył
- itd.
- itd.
???
Kurde, nie wiem jak to zrobić, ale jutro jeszcze po próbuje. Na razie idę spać.
Pozdro.
Napisz jak Ci się uda to rozwiązać.
Możesz zrobić to w jendym zapytaniu, np:
'SELECT pacjent_id,
(SELECT COUNT(pacjent_id) FROM `pacjenci` WHERE `pacjent_id`=pacjent_id)
as liczba_lekarzy
FROM `pacjenci`;
Być może trzeba bardziej pokombinować z tym subzapytaniem. Sam składałem takie jako wyniki z dwóch różnych tabel, więc wędrowanie po kolumnach było nieco prostsze.
Jednak pamiętaj, że nie jest to zbyt wydajne. Kiedy pytałem o podobny problem na forum php polecono mi po prostu - po najmniejszej linii oporu - dodać dodatkową kolumnę i nadpisywać w dwóch miejscach naraz - dodając nowy wiersz w jednej tabeli i w drugiej powiększać wartość odpowiadającej kolumny. Może i wydawać się ułomniejsze, to raczej z pewnością dużo wydajniejsze - w końcu dwa inserty/update'y raz na jakiś czas, niż mielenie po bazie przy jednym zapytaniu ;)
@Maviozo
Niestety po uruchomieniu Twojego zapytania, moim oczom ukazuje się 212 rekordów o wartości 212 :/
Edit: Na maturze jedyny wymóg jest taki, aby każdy podpunkt zadania był zrealizowany w jednym zapytaniu, bez względu na wydajność.
Tak jak mówię - trzeba pokombinować, ale to właśnie ten sposób rozwiąże problem. Tyle, że same zapytania napisałem z palca, niemniej jestem przekonany, że to właśnie trzeba subquery'em zrobić.
Dzięki za pomoc - spróbuję coś pokombinować.
Niemniej jeśli ktoś ma pomysł jak dokładnie to zrobić, to proszę się nie krępować, tylko pisać :)
Ufff... Po paru godzinach trudów udało się wreszcie :) Ale coś czuję, że na maturze będzie za mało czasu, żeby na takie coś wpaść :/
SELECT Nazwisko, Imie, COUNT(*) AS Ilosc_lekarzy
FROM Pacjenci, (SELECT DISTINCT Id_lekarza, Wizyty.Id_pacjenta FROM Wizyty) AS L
WHERE Pacjenci.Id_pacjenta=L.Id_pacjenta
GROUP BY Nazwisko, Imie;
Spróbuj tak:
SELECT Id_pacjenta, COUNT(*) AS Expr1
FROM tabela
GROUP BY Id_pacjenta
ORDER BY Expr1 DESC
blood co to jest?
Też się trochę pobawiłem, to moje zapytanie:
SELECT nazw, imie, COUNT(DISTINCT wizyty.idl) FROM pacjenci
LEFT JOIN wizyty
ON pacjenci.idp=wizyty.idp
GROUP BY nazw, imie
ORDER BY nazw
Dałem LEFT JOIN, bo w zadaniu jest "dla każdego pacjenta", a nie dla pacjentów którzy mieli wizytę.
SELECT DISTINCT Pacjenci.Id_pacjenta, Count(Wizyty.Data_wizyty) AS PoliczOfData_wizyty
FROM Pacjenci INNER JOIN (Lekarze INNER JOIN Wizyty ON Lekarze.Id_lekarza = Wizyty.Id_lekarza) ON Pacjenci.Id_pacjenta = Wizyty.Id_pacjenta
GROUP BY Pacjenci.Id_pacjenta, Pacjenci.Imie
ORDER BY Count(Wizyty.Data_wizyty) DESC;
@pszczesz
Twoje zapytanie oblicza ilość wizyt dla poszczególnego pacjenta, a nie ilość lekarzy, u których się leczył.
kwerenda pomocnicza: pomoc1
SELECT DISTINCT Pacjenci.Nazwisko, Pacjenci.Imie, Wizyty.Id_lekarza
FROM Pacjenci INNER JOIN Wizyty ON Pacjenci.Id_pacjenta=Wizyty.Id_pacjenta
ORDER BY Pacjenci.Nazwisko;
oraz właściwe zapytanie:
SELECT pomoc1.Nazwisko, pomoc1.Imie, Count(pomoc1.Id_lekarza) AS PoliczOfId_lekarza
FROM pomoc1
GROUP BY pomoc1.Nazwisko, pomoc1.Imie
ORDER BY 3 DESC;
Niestety przez ograniczenia Distinct nie wiem jak w jednym zapytaniu, ale w temacie nie ma nic o ograniczeniu do jednego zapytania
Natomiast w MS SQL 2008
bez problemu w jednym
use gabinetlek
go
select
Pacjenci.Nazwisko
,Pacjenci.Imie
,COUNT(distinct Wizyty.Id_lekarza) as [Ilosc Lekarzy]
from
pacjenci inner join Wizyty on Pacjenci.Id_pacjenta=Wizyty.Id_pacjenta
group by Pacjenci.Nazwisko,Pacjenci.Imie
order by 1 desc
go