· 6 years ago · Sep 11, 2019, 02:54 PM
1DROP PROCEDURE IF EXISTS all_drugs;
2
3DELIMITER $$
4CREATE PROCEDURE all_drugs (IN p VARCHAR(30), IN s VARCHAR(30), OUT numeroPazienti INT) -- p = principio attivo, s = settore medico
5BEGIN
6 DECLARE FarmacoMenoUsato VARCHAR(30) DEFAULT '';
7
8 -- tabella per i farmaci basati sul principio attivo p
9 DROP TABLE IF EXISTS FarmaciTarget3;
10 CREATE TABLE FarmaciTarget3 (Farmaco VARCHAR(30) NOT NULL PRIMARY KEY);
11 INSERT INTO FarmaciTarget3 -- farmaci basati su p
12 SELECT F.NomeCommerciale
13 FROM farmaco F
14 WHERE F.PrincipioAttivo = p;
15
16 -- query per il farmaco meno usato
17 SELECT D.Farmaco INTO FarmacoMenoUsato
18 FROM (
19 SELECT T.Farmaco, COUNT(*) AS Utilizzi-- usi nelle terapie del farmaco
20 FROM terapia T
21 INNER JOIN
22 patologia PA ON T.Patologia = PA.Nome
23 NATURAL JOIN
24 FarmaciTarget3 FT
25 WHERE PA.SettoreMedico = s
26 GROUP BY T.Farmaco
27 ) AS D
28 WHERE D.Utilizzi <= ALL (
29 SELECT COUNT(*) AS Utilizzi -- usi nelle terapie del farmaco
30 FROM terapia T
31 INNER JOIN
32 patologia PA ON T.Patologia = PA.Nome
33 NATURAL JOIN
34 FarmaciTarget3
35 WHERE PA.SettoreMedico = s
36 GROUP BY T.Farmaco
37 )
38 GROUP BY D.Farmaco;
39
40 SELECT COUNT(*) INTO numeroPazienti
41 FROM (
42 SELECT T.Paziente
43 FROM terapia T
44 INNER JOIN
45 patologia PA ON T.Patologia = PA.Nome
46 NATURAL JOIN
47 FarmaciTarget3 FT -- facciamo questo join perche' può aver usato nche altri farmaci
48 -- quindi il count nell'having non sarebbe corretto
49 WHERE PA.SettoreMedico = s
50 GROUP BY T.Paziente
51 HAVING COUNT(DISTINCT T.Farmaco) = (
52 SELECT COUNT(*)
53 FROM FarmaciTarget3 FT
54 )
55 UNION -- uniamo i resultset
56 SELECT D.Paziente
57 FROM (
58 SELECT T.Paziente
59 FROM terapia T
60 INNER JOIN
61 patologia PA ON T.Patologia = PA.Nome
62 NATURAL JOIN
63 FarmaciTarget3 FT -- facciamo questo join perche' può aver usato nche altri farmaci
64 -- quindi il count nell'having non sarebbe corretto
65 WHERE PA.SettoreMedico = s
66 GROUP BY T.Paziente
67 HAVING COUNT(DISTINCT T.Farmaco) = ( -- maca solo un farmaco
68 SELECT COUNT(*) - 1
69 FROM FarmaciTarget3 FT
70 )
71 ) AS D
72 WHERE FarmacoMenoUsato NOT IN ( -- pazienti dove nelle terapie manca solo quel farmaco
73 SELECT DISTINCT T2.Farmaco
74 FROM terapia T2
75 INNER JOIN
76 patologia PA2 ON T2.Patologia = PA2.Nome
77 NATURAL JOIN
78 FarmaciTarget3 FT2
79 WHERE PA2.SettoreMedico = s
80 AND T2.Paziente = D.Paziente
81 )
82 GROUP BY D.Paziente
83 ) AS DD;
84END $$
85DELIMITER ;
86
87CALL all_drugs ("Acido Acetilsalicilico", "Medicina generale", @cont);
88SELECT @cont;