Advertisement
Guest User

SQL NFZ

a guest
Feb 19th, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQL 2.52 KB | None | 0 0
  1. 1. Rysunek
  2.  
  3. Lekarz
  4. -------
  5. kod_lekarza VARCHAR(5)
  6. nazwisko VARCHAR(20)
  7. specjalizacja VARCHAR(20)
  8. -------
  9. Lekarz_PK(kod_lekarza)
  10.  
  11.         |
  12.         | Wiz_lek_FK
  13.         |
  14.  
  15. Wizyta
  16. -------
  17. nr_wizyty NUMERIC(4)
  18. koszt DECIMAL(10,2)
  19. kod_lekarza VARCHAR(5)
  20. kod_pacjenta NUMERIC(4)
  21. -------
  22. Wizyta_PK(nr_wizyty)
  23. Wiz_lek_FK(kod_lekarza)
  24. Wiz_pac_FK(kod_pacjenta)
  25.  
  26.         |
  27.         | Wiz_pac_FK
  28.         |
  29.  
  30. Pacjent
  31. ------
  32. kod_pacjenta NUMERIC(4)
  33. nazwisko VARCHAR(30)
  34. typ_pacjenta VARCHAR(15)
  35. ------
  36. Pacjent_PK(kod_pacjenta)
  37.  
  38. 2.
  39.  
  40. INSERT INTO Lekarz VALUES('A1000','Chudy','Patologia');
  41. -||-
  42.  
  43. INSERT INTO Pacjent VALUES(1010,'Wozniak','NFZ');
  44. -||-
  45.  
  46. INSERT INTO Wizyta VALUES(2000,0.0,'A1000',1010);
  47. -||-
  48.  
  49. 3 i 4.
  50.  
  51. CREATE SEQUENCE SEQ minvalue 1 maxvalue 100000 INCREMENT BY 1;
  52.  
  53. CREATE TABLE Typy AS
  54. (
  55.     SELECT SEQ.NEXTVAL "nr_typu" VARCHAR(20), specjalizacja FROM Lekarz
  56. )
  57.  
  58. ALTER TABLE Typy ADD CONSTRAINT Typy_PK PRIMARY KEY (nr_typu);
  59. ALTER TABLE Lekarz ADD CONSTRAINT Lek_typ_FK FOREIGN KEY (specjalizacja) REFERENCES Typy(nr_typu);
  60.  
  61. UPDATE Lekarz l SET l.specjalizacja = Typy.nr_typu FROM Typy t JOIN Lekarz ON l.specjalizacja = t.specjalizacja;
  62.  
  63. 5.
  64. CREATE OR REPLACE TRIGGER T_Wizyta
  65. BEFORE INSERT ON Wizyta
  66. FOR each ROW
  67. DECLARE
  68.     v_typ VARCHAR(15);
  69. BEGIN
  70.     SELECT rodzaj INTO v_typ FROM Pacjent p JOIN Wizyta w ON p.kod_pacjenta = w.kod_pacjenta WHERE nr_wizyty = :NEW.nr_wizyty;
  71.     IF v_typ IN ('NFZ') THEN
  72.         :NEW.koszt = 0.0;
  73.     END IF
  74. END;
  75.  
  76. 6.
  77. CREATE OR REPLACE FUNCTION F_Zysk(v_spec IN VARCHAR(20))
  78. RETURN DECIMAL(10,2) AS
  79.     v_id_spec NUMERIC(4);
  80.     v_suma DECIMAL(10,2);
  81. BEGIN
  82.     SELECT nr_typu INTO v_id_spec FROM Typy WHERE specjalizacja = v_spec;
  83.     SELECT SUM(koszt) INTO v_suma FROM Wizyta w JOIN Lekarz l ON w.kod_lekarza = l.kod_lekarza WHERE specjalizacja = v_id_spec;
  84.     RETURN v_suma;
  85. END;
  86.  
  87. 7.
  88. CREATE OR REPLACE VIEW v_perspektywa_1 AS
  89. SELECT Typy.specjalizacja, COUNT(Wizyta.nr_wizyty), SUM(Wizyta.koszt) FROM
  90.     Typy t JOIN Lekarz l ON t.nr_typu = l.specjalizacja JOIN Wizyta w ON l.kod_lekarza = w.kod_lekarza JOIN Pacjent p ON w.kod_pacjenta = p.kod_pacjenta WHERE p.typ_pacjenta IN ('Prywatny') GROUP BY t.specjalizacja
  91. ;
  92.  
  93. //ewentualnie NOT IN ('NFZ')
  94.  
  95. 8.
  96. CREATE OR REPLACE VIEW v_perspektywa_2 AS
  97. SELECT Lekarz.nazwisko, Typy.specjalizacja, COUNT(Wizyta.nr_wizyty) "liczba_wizyt" FROM
  98.     FROM Typy t JOIN Lekarz l ON t.nr_typu = l.specjalizacja JOIN Wizyta w ON l.kod_lekarza = w.kod_lekarza GROUP BY l.nazwsko, t.specjalizacja
  99.     HAVING liczba_wizyt > (SELECT avg(SELECT COUNT(*) FROM wizyty GROUP BY kod_lekarza) FROM dual)
  100. ;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement