Forum Gry Hobby Sprzęt Rozmawiamy Archiwum Regulamin

Forum: Problem ze stworzeniem odpowiedniego zapytania w SQL

14.05.2011 23:15
master53
1
master53
100
Legend
Image

Problem ze stworzeniem odpowiedniego zapytania w SQL

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 :)

14.05.2011 23:19
Tomal_P
2
odpowiedz
Tomal_P
100
Legend

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.

14.05.2011 23:22
Tomal_P
3
odpowiedz
Tomal_P
100
Legend

Choć teraz się zastanawiam czy da się w jednym zapytaniu to zrobić.....

14.05.2011 23:26
master53
4
odpowiedz
master53
100
Legend

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 :/

14.05.2011 23:31
Tomal_P
5
odpowiedz
Tomal_P
100
Legend

SELECT COUNT(*) FROM nazwa_tabeli WHERE ID_pacjenta = 6 - tym zapytaniem wyciągniesz liczbę ilu lekarzy leczyło pacjenta z ID = 6.

14.05.2011 23:33
Tomal_P
6
odpowiedz
Tomal_P
100
Legend

Z którego roku to jest pytanie? Zobaczyłbym jak wygląda cały arkusz. Tak z ciekawości.

14.05.2011 23:34
master53
😒
7
odpowiedz
master53
100
Legend

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

14.05.2011 23:36
Tomal_P
8
odpowiedz
Tomal_P
100
Legend

Czyli wynikiem ma być:
- ID_pacjenta, liczba lekarzy u których się leczył
- ID_pacjenta, liczba lekarzy u których się leczył
- itd.
- itd.

???

14.05.2011 23:36
master53
👍
9
odpowiedz
master53
100
Legend

Dokładnie tak.

14.05.2011 23:44
Tomal_P
10
odpowiedz
Tomal_P
100
Legend

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

14.05.2011 23:49
maviozo
11
odpowiedz
maviozo
226
autor zdjęć

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

14.05.2011 23:53
master53
12
odpowiedz
master53
100
Legend

@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ść.

14.05.2011 23:57
maviozo
13
odpowiedz
maviozo
226
autor zdjęć

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

14.05.2011 23:59
master53
👍
14
odpowiedz
master53
100
Legend

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ć :)

15.05.2011 01:44
master53
👍
15
odpowiedz
master53
100
Legend

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;

15.05.2011 02:46
blood
16
odpowiedz
blood
241
Legend

Spróbuj tak:

SELECT Id_pacjenta, COUNT(*) AS Expr1
FROM tabela
GROUP BY Id_pacjenta
ORDER BY Expr1 DESC

15.05.2011 15:38
17
odpowiedz
Qbaa
113
Senator

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ę.

15.05.2011 15:49
master53
😒
18
odpowiedz
master53
100
Legend

@Qbaa

Niestety Access 2007 buntuje się przeciwko DISTINCT wewnątrz COUNT.

15.05.2011 16:16
19
odpowiedz
pszczesz
71
Pretorianin

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;

15.05.2011 16:32
master53
20
odpowiedz
master53
100
Legend

@pszczesz

Twoje zapytanie oblicza ilość wizyt dla poszczególnego pacjenta, a nie ilość lekarzy, u których się leczył.

15.05.2011 17:03
21
odpowiedz
pszczesz
71
Pretorianin

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

Forum: Problem ze stworzeniem odpowiedniego zapytania w SQL