2002 – Banca del Tempo

SCHEMA E/R

All’atto dell’iscrizione il socio dichiara la zona dove risiede e le categorie di prestazioni che offre

2002_1

Se l’associazione ha un numero elevato di soci allora i soci dichiarano le singole prestazioni piuttosto che le categorie

2002_0

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)

2002_2

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

2002_bdt

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)