Utworzenie widoów

I2
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 229
0

Witam
Mam do napisania kilka widokow do bazy danych "przychodni lekarskiej"
Model fizyczny dorzucam w załączniku.

Napisałem kilka przykładowych :

Kopiuj
 ALTER VIEW "DBA"."Aktualne_Recepty" AS 
SELECT DBA.Pacjent.Imie,DBA.Pacjent.Nazwisko,Nr_Recepta FROM Pacjent,Recepta
where Data_Realizacji<getdate()
Kopiuj
 ALTER VIEW "DBA"."Ile_recept" AS 
select Imie,Nazwisko, count(PESEL) Liczba_Recept from (
Select   Pacjent.Imie,Pacjent.nazwisko,Pacjent.PESEL from Pacjent,Recepta
where recepta.PESEL=pacjent.PESEL) TAB
GROUP BY Imie,Nazwisko
Kopiuj
CREATE MATERIALIZED VIEW "DBA"."lekarze" as
SELECT DBA.Lekarz.Imie,DBA.Lekarz.Nazwisko,DBA.Specjalizacja.Nazwa_Specjalizacja,Specjalizacja.Stopien,Specjalizacja.Uprawnienia 
FROM  Lekarz,Specjalizacja,"Posiada Specjalizację"
where lekarz.ID_Lekarz="Posiada Specjalizację".ID_Lekarz and "Posiada Specjalizację".ID_Specjalizacja=Specjalizacja.ID_Specjalizacja   
ORDER BY nazwisko 

I mam dwie prośby :

  1. Chciałbym napisać takie zapytanie aby zliczało mi ile skierowań i recept wypisano w danych miesiącach. Udało mi się zliczyć te z recept ale jak dorzucić liczbę skierowań ?
Kopiuj
 SELECT  month(Data_Wystawienia) miesiac, count(month(Data_Wystawienia)) ilosc 
from Pacjent,Recepta,Skierowanie
Skierowanie.Data_Wystawienia
  1. Czy ma ktoś jeszcze pomysł na trochę bardziej skomplikowany widok ?
XI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 245
0

Powiązać producentów leków po wypisanych receptach z lekarzami, żeby wytypować, który z lekarzy bierze w łapę.

mszewcz
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 31
0

Ad 1.

Można na przykład tak:

Kopiuj
SELECT r Rok, m Miesiac, SUM(c) Ilosc 
FROM (
(SELECT YEAR(Data_Wystawienia) r, MONTH(Data_Wystawienia) m, COUNT(*) c FROM Recepta GROUP BY r,m) UNION 
(SELECT YEAR(Data_Wystawienia) r, MONTH(Data_Wystawienia) m, COUNT(*) c FROM Skierowanie GROUP BY r,m)
) tab
GROUP BY r,m
ORDER BY r,m

Choć wydajność takiego zapytania przy dużej ilości rekordów pozostawi zapewne wiele do życzenia. Dużo lepszy rezultat uzyskałbyś, gdyby tabele Recepta i Skierowanie zawierały pola Rok_Wystawienia i Miesiac_Wystawienia oraz indeks (jeden) na tych dwóch polach, a zapytanie miałoby postać:

Kopiuj
SELECT r Rok, m Miesiac, SUM(c) Ilosc 
FROM (
(SELECT Rok_Wystawienia r, Miesiac_Wystawienia m, COUNT(*) c FROM Recepta GROUP BY r,m) UNION 
(SELECT Rok_Wystawienia r, Miesiac_Wystawienia m, COUNT(*) c FROM Skierowanie GROUP BY r,m)
) tab
GROUP BY r,m
ORDER BY r,m

Do zewnętrznego grupowana oraz sortowania i wymagane będzie użycie tabeli tymczasowej, jednak będzie ona stosunkowo mała, więc nie powinno to znacząco wpłynąć na wydajność. Wykorzystasz jednak indeksy w zapytaniach wewnętrznych, które będą operowały na dużej ilości danych, a to już na wydajność wpłynie.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.