SCHEMA E/R
All’atto dell’iscrizione il socio dichiara la zona dove risiede e le categorie di prestazioni che offre
Se l’associazione ha un numero elevato di soci allora i soci dichiarano le singole prestazioni piuttosto che le categorie
Quando viene svolto un servizio si registrano i dati del socio donatore, del socio ricevitore e la prestazione (oltre che la data e le ore svolte)
ZONA
- Una zona può ospitare uno o più soci
SOCIO
- Un socio abita in una zona
- Un socio offre la sua disponibilità per una o più prestazioni
- Un socio può prestare servizio a favore di uno più soci (svolgendo una o più prestazioni) in date diverse
- Un socio può ottenere un servizio da uno o più soci (usufruendo di una o più prestazioni) in date diverse
CATEGORIA
- Una categoria è costituita da una o più prestazioni
PRESTAZIONE
- Una prestazione appartiene a una categoria
- Una prestazione è offerta da uno o più soci
- Una prestazione può essere svolta da uno o più soci
- Una prestazione può essere ricevuta da uno o più soci.
SCHEMA RELAZIONALE
QUERY
Chi può svolgere una prestazione in una zona
SELECT SOCI.* FROM ((ZONE INNER JOIN SOCI ON ZONE.IDzona = SOCI.zonaID) INNER JOIN SOCI_PREST ON SOCI.IDsocio = SOCI_PREST.socioID) INNER JOIN PRESTAZIONI ON SOCI_PREST.prestazioneID = PRESTAZIONI.IDprestazione WHERE (PRESTAZIONI.nome = [Scegli la prestazione]) AND (ZONE.nome = [Scegli la zona]) ORDER BY cognome,nome
Classifica dei soci per ore prestate
SELECT IDsocio, cognome, nome, Sum(ore) AS [Ore prestate] FROM SOCI INNER JOIN SERVIZI ON SOCI.IDsocio = SERVIZI.socioID1 GROUP BY IDsocio,cognome,nome ORDER BY Sum(ore) DESC
Classifica dei soci per ore ricevute
SELECT IDsocio, cognome, nome, Sum(ore) AS [Ore prestate] FROM SOCI INNER JOIN SERVIZI ON SOCI.IDsocio = SERVIZI.socioID2 GROUP BY IDsocio,cognome,nome ORDER BY Sum(ore) DESC
Classifica delle categorie per ore di servizio
SELECT CATEGORIE.nome, Sum(ore) AS [Ore prestate] FROM (SERVIZI INNER JOIN PRESTAZIONI ON SERVIZI.prestazioneID = PRESTAZIONI.IDprestazione) INNER JOIN CATEGORIE ON PRESTAZIONI.categorieID = CATEGORIE.IDcategoria GROUP BY CATEGORIE.nome ORDER BY Sum(ore) DESC
Chi è in credito per le ore prestate?
SELECT SOCI.* FROM SOCI WHERE (SELECT Sum(ore) AS OreDate FROM SERVIZI WHERE SERVIZI.socioID1 = SOCI.IDsocio) > (SELECT Sum(ore) AS OreAvute FROM SERVIZI WHERE SERVIZI.socioID2 = SOCI.IDsocio) ORDER BY cognome,nome
CREATE VIEW SOCI1 AS SELECT IDsocio1, Sum(ore) AS ore1 FROM SERVIZI GROUP BY IDsocio1;
CREATE VIEW SOCI2 AS SELECT IDsocio2, Sum(ore) AS ore2 FROM SERVIZI GROUP BY IDsocio2;
SELECT IDsocio, cognome, nome, (ore1-ore2) AS credito FROM (SOCI INNER JOIN SOCI1 ON SOCI.IDsocio = SOCI1.IDsocio1) INNER JOIN SOCI2 ON SOCI1.IDsocio1 = SOCI2.IDsocio2 ORDER BY (ore1-ore2) DESC
Chi svolge attività di SEGRETERIA
CREATE VIEW SEGRETARI AS SELECT SOCI.* FROM (SOCI INNER JOIN SOCI_PREST ON SOCI.IDsocio = SOCI_PREST.socioID) INNER JOIN CATEGORIE ON SOCI_PREST.categoriaID = CATEGORIE.categoriaID WHERE CATEGORIE.nome = "SEGRETERIA"
Chi svolge attività diverse da SEGRETERIA
CREATE VIEW ALTRO AS SELECT SOCI.* FROM (SOCI INNER JOIN SOCI_PREST ON SOCI.IDsocio = SOCI_PREST.socioID) INNER JOIN CATEGORIE ON SOCI_PREST.categoriaID = CATEGORIE.categoriaID WHERE CATEGORIE.nome <> "SEGRETERIA"
Chi svolge altre attività oltre a SEGRETERIA
SELECT * FROM ALTRO WHERE ALTRO.IDsocio NOT IN (SELECT IDsocio FROM SEGRETERIA)