Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
vuoi
o PayPal
tutte le volte che vuoi
OPERATORI AGGREGATI
Per adesso come operazioni da fare su gruppi di record abbiamo visto count(*); in SQL ci sarebbero
anche altre varianti, ma nel nostro caso si considera solo count(*). Abbiamo visto che se non
facciamo GROUP BY, mi conta tutte le righe della mia tabella come se fossero un unico grande
gruppo; se invece facciamo GROUP BY, conta le righe di ogni gruppo. count(*) calcola il numero dei
record che ottengo come risultato del Join della selezione.
Altri operatori aggregati:
• sum(Attributo): calcola la somma dei valori dell’Attributo in ogni gruppo di record.
• min(Attributo): calcola il minimo valore dell’attributo in ogni gruppo di record.
• max(Attributo): calcola il massimo valore dell’attributo in ogni gruppo di record.
• avg(Attributo): calcola la media dei valori dell’attributo in ogni gruppo di record.
ESEMPI: Partendo dalla solita tabella Impiegati, ora vado a fare la sum(Stipendio). Rispetto a prima,
per ogni dipartimento, anziché dirmi quanti impiegati ci sono, mi restituisce la somma degli stipendi
di quegli impiegati. In Distribuzione c’è solo Neri che guadagna 45 e quindi la somma sarà 45. In
Produzione abbiamo invece Bianchi 36 + Franco 46 = 82. Messe insieme le righe, anziché fare
count(*), ha fatto la somma degli stipendi. In una seconda query vediamo che li usiamo tutti in un
colpo solo (ne possiamo usare più di uno) ed i risultati sono dati da colonne diverse della solita
tabella. Per ogni dipartimento calcolo la somma degli stipendi sum(Stipendio), lo stipendio minimo
min(Stipendio), lo stipendio medio avg(Stipendio) e lo stipendio massimo max(Stipendio). Questo
lo ha fatto per ogni gruppo.
Di operatori ce ne sono tanti altri, questi sono quelli più comuni. In realtà, anche a seconda del DBBS
che usiamo, a volte ci sono delle funzioni in più ed in meno. Funzionano nello stesso modo ma a
seconda del programma potete fare dei calcoli piuttosto che altri. Questi operatori invece essendo
di base si possono utilizzare in tutti i programmi.
ESEMPIO 7: “Estrarre cognome, numero (quanti sono) e stipendio medio degli impiegati che
lavorano nel dipartimento di “Amministrazione” o “Direzione”, raggruppati per Cognome”
Su questo raggruppamento voglio calcolare queste due
operazioni aggregate: il conteggio e lo stipendio medio. Quello
che devo fare è la selezione per Dipart=”Amministrazione” OR
Dipart=”Direzione”, così da escludere tutti gli impiegati che
lavorano altrove. Selezionati in questo modo, li vado a
raggruppare per Cognome ed una volta raggruppati, li conto con count(*) (AS, alias, Numero), faccio
lo stipendio medio con avg(Stipendio) e lo chiamo con AS
StipendioMedio.
Variante: “Supponiamo (calcolati questi numeri e stipendi
medi) di voler visualizzare solo i gruppi il cui stipendio
medio è maggiore di 50”
Abbiamo ad esempio i 3 Rossi che guadagnano 69, Lanzi che guadagna 73 e Neri che guadagna 52.
Borroni e Verdi guadagnano meno di 50 e quindi li vorrei escludere. Devo fare una selezione con
avg(Stipendio)>50. Aggiungo una clausola WHERE, che mi fa la selezione sulle singole righe, sul
tabellone Impiegati (sempre quella da cui parto, allegata nelle pagine precedenti) e sulle singole
righe.
Non posso dire stipendio medio >50 perché nelle singole righe è solo lo stipendio di un singolo
impiegato. La selezione che devo fare non è una
selezione normale che posso fare con WHERE.
La selezione che ho da fare la devo fare sulla
tabella dopo aver fatto raggruppamento ed aver
calcolato le medie. WHERE mi va a fare la
selezione sulla tabella di partenza, ma la mia
condizione parla di stipendi medi, quindi di
gruppi, non di singoli impiegati.
Per fare questa seconda selezione che vorrei fare
dopo raggruppamento, ho bisogno di qualcosa di nuovo: ho bisogni in questo caso di una causa che
si chiama HAVING, che aggiungo alle altre clausole. HAVING mi consente di specificare una
condizione, per fare una selezione, ma che è una selezione ulteriore, una selezione successiva a
raggruppamento che vado a fare sulla tabella con i risultati dei gruppi. In questa condizione posso
andare anche a utilizzare operatori aggregati. Posso ad esempio andare a fare un calcolo su tutte le
righe del gruppo per vedere se quel gruppo di righe soddisfa la proprietà che mi interessa. Vado
dunque a fare HAVING avg(Stipendio)>50. Di tutte queste righe vado a risparmiare solo quelle che
corrispondono a dei gruppi il cui stipendio medio è maggiore di 50. Ho creato un alias per
avg(Stipendio) e quindi posso scrivere anche AS StipendioMedio. La cosa importante è che HAVING
mi abbia consentito di fare una seconda selezione successiva a raggruppamento in cui la condizione
che vado a scrivere è una condizione che riguarda i gruppi di impiegati, in particolare le condizioni
usano tipicamente le condizioni aggregate, condizioni che di solito riguardano il gruppo.
RIEPILOGO
Quindi questa è la struttura generale di una query SQL e la sua esecuzione.
Struttura:
• SELECT attributo1. Attributo2
• FROM tabella1, tabella2
• WHERE condizione
• GRUOP BY attributo1, attibuto2
• HAVING condizione 2
• ORDER BY attributo X, attributoY
Si può anche usare AS per definire alias di attributi.
ESEMPIO FINALE: “Elencare, in ordine alfabetico, i nomi dei dipartimenti di Milano in cui lavorano
almeno due impiegati calcolando la somma degli stipendi degli impiegati che vi lavorano”
Voglio considerare i dipartimenti in cui lavorano almeno 2
impiegati, e di questi dipartimenti voglio calcolare la somma
degli stipendi degli impiegati e presentare il risultato in ordine
alfabetico. Mi servono tutte e due le tabelle: IMPIEGATI e
DIPARTIMENTI.
Con queste due tabelle innanzitutto devo andare a fare il Join
delle due tabelle (in cui ho messo anche degli alias) ed è bene
che vada a mettere la condizione che fa si che io vada a selezionare
solo le combinazioni di righe che hanno senso: in questo caso lo
faccio collegando la chiave esterna con la chiave primaria quindi
Dipart = D.Nome (voglio fare riferimento al dipartimento di
quell’impiegato). Successivamente mi interessano i dipartimenti di
Milano e quindi metto nella selezione anche un AND D.Città = “Milano”, per escludere il resto dei
dipartimenti. Fatta la selezione a questo punto vado a raggruppare; voglio raggruppare per
dipartimento, perché io voglio calcolare per ogni dipartimento la somma degli stipendi degli
impiegati, quindi nel risultato voglio una riga per ogni dipartimento, raggruppando BY D.Nome. Una
volta che li ho selezionati, nel gruppo posso scrivere sia D.Nome che Dipart. Per ogni dipartimento
di Milano ho la somma degli stipendi dei dipendenti, però in realtà sono interessato ai dipartimenti
che hanno almeno 2 impiegati, ma i dipartimenti di Milano entrambi hanno più di 2 impiegati, quindi
entrambi soddisfano la condizione HAVING count(*)>2. Se considerassi i dipartimenti non solo di
Milano, a questo punto avrei anche Distribuzione e Produzione. Per concludere aggiungo ORDER BY
D.Nome e anche in questo caso non cambia niente perché sono già in ordine alfabeti.
[Il Professore voleva fare un esempio più esemplificativo poiché le condizioni aggiunte non
selezionano ulteriormente i dati e dunque non mettono in risalto il ruolo degli operatori, però
comunque ci ha fatto vedere i vari passaggi e come questi funzionano
LEZIONE 5 31/ 03/ 2021,
SISTEMI INFORMATIVI SANITARI: ASPETTI FI INTEGRAZIONE DI DATI:
Introduzione
La volta scorsa abbiamo completato una prima parte del corso sulle basi di dati e sulle tecniche di
interrogazione delle basi di dati: abbiamo visto il linguaggio SQL di cui abbiamo visto alcuni esempi
(il professore ci ha lasciato delle dispense con degli esercizi che possiamo fare).
Ora spenderemo altre due lezioni per fare un argomento meno tecnico che riguarda molti aspetti
che sono importanti nella realizzazione di un grosso sistema informativo come quelli che sono
utilizzati in ambito sanitario. Dobbiamo affrontare tecniche che consentono di integrare database
di soggetti diversi, di enti e organismi diversi in un unico grande sistema integrato. Nella prossima
lezione tratteremo anche aspetti che riguardano la protezione di dati che andiamo a inserire in
questi sistemi, quindi toccheremo aspetti che sono relativi sia alla privacy ma anche alla sicurezza
informatica.
Oggi nella prima parte portiamo aspetti che riguardano l’integrazione dei dati, quindi quali sono le
tecniche che consentono di mettere insieme tanti dati di sorgenti diverse e quali sono le principali
problematiche da affrontare per realizzare un sistema di questo tipo. In particolare partiremo
descrivendo quali sono le caratteristiche dei sistemi informativi che si usano nell’ambito del
Servizio Sanitario Nazionale per capire quali sono le funzionalità che è bene che i sistemi
informatici possano fornire. Ci concentreremo sia sull’aspetto sanitario, quindi sulla gestione dei
dati sanitari dei cittadini, sia sui processi in ambito più specificamente ospedaliero, quindi sulla
gestione dei dati relativa ad esempio a un singolo ricovero, e vedremo che due strumenti
importanti in questi due ambiti che consentono di ottenere integrazione di dati da diverse fonti
sono il Fascicolo Sanitario Elettronico e la Cartella Clinica Elettronica (questi sono due esempi di
integrazione di sistemi in ambito sanitario e in ambito ospedaliero). Poi faremo un “passettino”
più verso gli aspetti tecnici, senza però andare troppo nel dettaglio ma cercando un po’ di capire
quali sono le problematiche che richiedono un intervento tecnico. Inoltre vedremo un po’ quali
sono le principali metodologie per l’integrazione dei dati (brevemente parleremo del modello
“client-server” che è il modo con cui solitamente si consente in informatica di accentrare dei dati
in un unico database consentendo ad utenti remoti di accedere anche tramite la rete). Vedremo
quali sono le diverse modalità di accesso ai dati che si possono mettere in piedi e parleremo anche
di misure di standardizzazione, quindi di come rendere uniformi i database da integrare in modo
tale che poi l’integrazione possa effettivamente avvenire. Ci concentreremo più sulle
problematiche e i concetti che sui dettagli tecnici.
Integrazione di dati nel SSN: motivazioni
Partiamo con l’analizzare le caratteristiche del SSN per capire come un sistema informatico ci
possa aiutare.
Il servizio Sanitario Nazionale (SSN) è un sistema complesso:
questo vuol dire che in generale ci sono tanti componenti
che hanno un certo livello di autonomia e che devono
interagire per svolgere determinate
funzioni.
Il concetto di sistema complesso è un concetto che non si
<