-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcreate_table.sql
133 lines (103 loc) · 5.49 KB
/
create_table.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
--- QUERY DI CREAZIONE DELLE TABELLE PER IL DB
CREATE TABLE tipologia_centro_vaccinale
(
id SERIAL PRIMARY KEY,
nome VARCHAR(32) NOT NULL
);
CREATE TABLE centri_vaccinali
(
id SERIAL PRIMARY KEY,
nome VARCHAR(128) NOT NULL,
tipologia_id SERIAL REFERENCES tipologia_centro_vaccinale (id) NOT NULL,
stato NUMERIC(2) NOT NULL,
indirizzo_qualificatore VARCHAR(16),
indirizzo VARCHAR(128),
indirizzo_civico VARCHAR(8),
indirizzo_comune VARCHAR(64),
indirizzo_sigla_provincia VARCHAR(4),
indirizzo_cap VARCHAR(8)
);
CREATE TABLE tipologia_vaccino
(
id SERIAL PRIMARY KEY,
nome VARCHAR(32) NOT NULL,
produttore VARCHAR(64) NOT NULL
);
CREATE TABLE vaccinati
(
id SERIAL PRIMARY KEY,
id_univoco VARCHAR(128) NOT NULL,
centro_vaccinale_id SERIAL REFERENCES centri_vaccinali (id) NOT NULL,
tipologia_vaccino_id SERIAL REFERENCES tipologia_vaccino (id) NOT NULL,
nome VARCHAR(64) NOT NULL,
cognome VARCHAR(64) NOT NULL,
codice_fiscale VARCHAR(24) NOT NULL,
data_somministrazione TIMESTAMP NOT null,
email VARCHAR(128),
pass VARCHAR(128)
);
CREATE TABLE tipologia_evento
(
id SERIAL PRIMARY KEY,
nome VARCHAR(64) NOT NULL
);
CREATE TABLE eventi_avversi
(
id SERIAL PRIMARY KEY,
vaccinato_id SERIAL REFERENCES vaccinati (id) NOT NULL,
tipologia_evento_id SERIAL REFERENCES tipologia_evento (id) NOT NULL,
severita NUMERIC(2) NOT NULL,
note VARCHAR(256)
);
--- QUERY DI RICERCA UTILI
-- count vaccinati nel db
SELECT COUNT(*) FROM vaccinati;
-- ricerca di un centro vaccinale
SELECT * FROM centri_vaccinali WHERE LOWER(nome) LIKE '%vac%' ORDER BY id DESC;
-- eventi avversi list in un centro vaccinale getEventiAvversiCV(2)
SELECT ea.* FROM eventi_avversi ea INNER JOIN vaccinati v ON ea.vaccinato_id = v.id INNER JOIN centri_vaccinali cv ON v.centro_vaccinale_id = cv.id WHERE cv.id = '2';
-- count tipologia eventi avversi in un centro vaccinale
SELECT te_scroll.nome, (
SELECT count(*) FROM eventi_avversi ea INNER JOIN vaccinati v ON ea.vaccinato_id = v.id INNER JOIN centri_vaccinali cv ON v.centro_vaccinale_id = cv.id
WHERE ea.tipologia_evento_id = te_scroll.id AND cv.id = '2'
) total from tipologia_evento te_scroll ORDER BY te_scroll.id ASC;
-- numero totale di eventi avversi per ogni centro vaccinale
SELECT cv_scroll.id, cv_scroll.nome, (
SELECT SUM(total) somma_ea
FROM (SELECT (
SELECT count(*) FROM eventi_avversi ea INNER JOIN vaccinati v ON ea.vaccinato_id = v.id INNER JOIN centri_vaccinali cv ON v.centro_vaccinale_id = cv.id
WHERE ea.tipologia_evento_id = te_scroll.id AND cv.id = cv_scroll.id
) total FROM tipologia_evento te_scroll
) eventi_avversi_total
) FROM centri_vaccinali cv_scroll ORDER BY cv_scroll.id DESC;
-- numero di persone con almeno un evento avverso per centro vaccinale
SELECT cv_scroll.id, cv_scroll.nome, (
SELECT COUNT(persone_con_ea) vaccinati_con_ea
FROM (SELECT DISTINCT ea.vaccinato_id persone_con_ea FROM eventi_avversi ea INNER JOIN vaccinati v ON ea.vaccinato_id = v.id WHERE v.centro_vaccinale_id = cv_scroll.id) somma
) FROM centri_vaccinali cv_scroll ORDER BY cv_scroll.id DESC;
-- severita media eventi avversi per un centro vaccinale
SELECT AVG(ea.severita) FROM vaccinati v JOIN eventi_avversi ea ON v.id = ea.vaccinato_id WHERE v.centro_vaccinale_id = '2';
-- vaccinati per ogni centro vaccinale vaccinatiPerOgniCentroVaccinale()
SELECT cv.id, cv.nome, count(*) vaccinati FROM vaccinati v INNER JOIN centri_vaccinali cv ON v.centro_vaccinale_id = cv.id GROUP BY cv.id ORDER BY cv.id ASC;
-- VISTA elenco centri vaccinali con numero persone che hanno avuto eventi avversi + numero totale di eventi avversi + numero totale di vaccinati
CREATE OR REPLACE VIEW dashboard_centri_vaccinali as
SELECT t1.*, t2.somma_ea, COALESCE(vaccinati, 0)vaccinati FROM
(SELECT cv_scroll.id, cv_scroll.nome, (
SELECT COUNT(persone_con_ea) vaccinati_con_ea
FROM (SELECT DISTINCT ea.vaccinato_id persone_con_ea FROM eventi_avversi ea INNER JOIN vaccinati v ON ea.vaccinato_id = v.id WHERE v.centro_vaccinale_id = cv_scroll.id) somma
) FROM centri_vaccinali cv_scroll) t1
JOIN
(SELECT cv_scroll.id, cv_scroll.nome, (
SELECT SUM(total) somma_ea
FROM (SELECT (
SELECT count(*) FROM eventi_avversi ea INNER JOIN vaccinati v ON ea.vaccinato_id = v.id INNER JOIN centri_vaccinali cv ON v.centro_vaccinale_id = cv.id
WHERE ea.tipologia_evento_id = te_scroll.id AND cv.id = cv_scroll.id
) total FROM tipologia_evento te_scroll
) eventi_avversi_total
) FROM centri_vaccinali cv_scroll) t2
ON t1.id = t2.id
LEFT JOIN
(SELECT cv.id, cv.nome, count(*) vaccinati FROM vaccinati v INNER JOIN centri_vaccinali cv ON v.centro_vaccinale_id = cv.id GROUP BY cv.id) t3
ON t2.id = t3.id
ORDER BY t1.id DESC;
SELECT * FROM dashboard_centri_vaccinali;