Advertisement
Guest User

Untitled

a guest
Sep 17th, 2019
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MySQL 2.82 KB | None | 0 0
  1. -- creo una function che prnde un medico e dice se questo ha
  2. -- effettuato un numero mensile di visite crescenti per almeno
  3. -- tre mesi consecutivi nello stesso anno, in uno tra gli
  4. -- ultimi 10 anni
  5. DROP FUNCTION IF EXISTS ha_tre_visite_crescenti;
  6. DELIMITER $$
  7. CREATE FUNCTION ha_tre_visite_crescenti(_medico CHAR(50))
  8. RETURNS BOOL NOT DETERMINISTIC READS SQL DATA
  9. BEGIN
  10.   DECLARE anno INT;
  11.   DECLARE mese INT;
  12.   DECLARE res BOOL DEFAULT FALSE;
  13.   DECLARE numVcurr INT;
  14.   DECLARE numVprec INT;
  15.   DECLARE numVprecprec INT;
  16.  
  17.  
  18.   SET anno = YEAR(CURRENT_DATE - INTERVAL 10 YEAR);
  19.  
  20.   -- faccio un doppio ciclo in cui scorro tutti gli anni
  21.   -- da 10 anni fa ad ora, e dal mese di marzo a dicembre
  22.   WHILE anno < YEAR(CURRENT_DATE) DO
  23.     SET mese = 3;
  24.     -- sto attento alla condizione di uscita,
  25.     -- se mi trovo nell'anno correne devo assicuramri di
  26.     -- non superare il mese corrente
  27.     WHILE (mese < 13 AND
  28.         NOT( mese > MONTH(CURRENT_DATE)
  29.         AND anno = YEAR(CURRENT_DATE))) DO
  30.       -- calcolo le visite di questo mese
  31.       SET numVcurr = (
  32.                     SELECT COUNT(*)
  33.                     FROM visita
  34.                     WHERE Medico=_medico AND
  35.                           YEAR(Data)=anno AND
  36.                           MONTH(Data)=mese
  37.                       );
  38.       -- calcolo le visite del mese prima
  39.       SET numVprec = (
  40.                     SELECT COUNT(*)
  41.                     FROM visita
  42.                     WHERE Medico=_medico AND
  43.                           YEAR(Data)=anno AND
  44.                           MONTH(Data)=mese -1
  45.                       );
  46.       -- calcolo le visite del mese prima ancora
  47.       SET numVprecprec = (
  48.                     SELECT COUNT(*)
  49.                     FROM visita
  50.                     WHERE Medico=_medico AND
  51.                           YEAR(Data)=anno AND
  52.                           MONTH(Data)=mese-2
  53.                       );
  54.      
  55.       -- scrivo sul risultato se le visite sono
  56.       -- in ordine crescente
  57.       SET res = res OR
  58.     (numVcurr > numVprec AND numVprec > numVprecprec);
  59.      
  60.       SET mese = mese+1;
  61.     END WHILE;  
  62.  
  63.     SET anno = anno +1;
  64.   END WHILE;
  65.  
  66.   RETURN res;
  67. END $$
  68. DELIMITER ;
  69.  
  70.  
  71. -- controllo per ogni medico, se ha fatto tre visite crescenti
  72. -- e ne esiste un altro della stessa specializzazione ma di
  73. -- citta diverse che ha anche lui ha fatto tre visite
  74. -- consecutive, se esistono stampo la specializzazione
  75. SELECT DISTINCT m.Specializzazione
  76. FROM medico m
  77. WHERE ha_tre_visite_crescenti(m.Matricola) AND
  78.       EXISTS (SELECT *
  79.               FROM medico s
  80.               WHERE s.Specializzazione=m.Specializzazione AND
  81.                     s.Matricola=m.Matricola AND -- <- sono un coglionazzo
  82.                     s.Citta<>m.Citta AND
  83.                     ha_tre_visite_crescenti(s.Matricola)
  84.               );
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement