peppe_rossi

discount_drug

Jan 20th, 2021 (edited)
762
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. DROP PROCEDURE IF EXISTS discount_drug;
  2. DELIMITER $$
  3.  
  4. CREATE PROCEDURE discount_drug(IN _s VARCHAR(45), IN _k INT)
  5. BEGIN
  6.     -- Variabili per salvarmi valori intermedi della formula
  7.     DECLARE maxT INT;
  8.     DECLARE somma DOUBLE;
  9.    
  10.     DECLARE quanti INT;
  11.    
  12.     DROP TEMPORARY TABLE IF EXISTS Temp;
  13.     CREATE TEMPORARY TABLE Temp AS (
  14.         SELECT T.Farmaco,
  15.             COUNT(*) AS numTerapie,
  16.             SQRT(1/COUNT(*)) AS termineSomma
  17.         FROM Terapia T
  18.             INNER JOIN Patologia P
  19.             ON T.Patologia = P.Nome
  20.         WHERE (YEAR(T.DataInizioTerapia) = '2015'
  21.                 OR YEAR(T.DataFineTerapia) = '2015')
  22.             AND P.SettoreMedico = _s
  23.         GROUP BY T.Farmaco
  24.         ORDER BY numTerapie DESC
  25.         LIMIT _k
  26.     );
  27.    
  28.     -- Vedo se il numero k che mi ha dato è valido
  29.     SET quanti = (SELECT COUNT(*) FROM Temp);
  30.     IF quanti < _k THEN
  31.         SIGNAL SQLSTATE '45000'
  32.             SET MESSAGE_TEXT = 'k non valido, inserire numero piu piccolo';
  33.     END IF;
  34.     -- Massimo numero di terapie
  35.     SET maxT = (SELECT MAX(numTerapie) FROM Temp);
  36.     -- Tutta la parte nella parentesi della formula
  37.     SET somma = 1 + _k * (SELECT SUM(termineSomma) FROM Temp);
  38.     -- Applico lo sconto ai farmaci
  39.     UPDATE Farmaco F
  40.         INNER JOIN Temp T
  41.         ON F.NomeCommerciale = T.Farmaco
  42.     SET F.Costo = F.Costo - T.numTerapie / maxT * somma;
  43. END$$
  44.  
  45. DELIMITER ;
RAW Paste Data