Utworzenie widoów

0

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

Napisałem kilka przykładowych :

 ALTER VIEW "DBA"."Aktualne_Recepty" AS 
SELECT DBA.Pacjent.Imie,DBA.Pacjent.Nazwisko,Nr_Recepta FROM Pacjent,Recepta
where Data_Realizacji<getdate()
 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
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ń ?
 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 ?
0

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

0

Ad 1.

Można na przykład tak:

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

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1