Risulta difficile descrivere le procedure relative ai controlli nei punti di dogana di un aeroporto
- Un funzionario svolge un servizio in un punto di dogana o secondo dei turni?
- Un punto di dogana ha più punti di controllo?
- Un addetto svolge un servizio in un punto di controllo o secondo dei turni?
- Un passeggero può avere più bagagli?
- Un passeggero può avere più merci addosso e/o in un bagaglio?
- Il controllo di una merce può portare all’imposizione di un dazio e/o al sequestro e/o al fermo del passeggero?
- …
Dipendenti
- Un punto di dogana contiene uno o più punti di controllo.
- Un funzionario svolge i suoi servizi nei punti di dogana.
- Un addetto svolge i suoi servizi nei punti di controllo.
- Un servizio è registrato con un Inizio e una Fine.
Merci
- Una merce appartiene a una categoria e si presenta con una certa quantità.
- Una categoria di merce ha un eventuale dazio da applicare alle merci corrispondenti.
Passeggeri
- Un passeggero passa al punto di controllo con certi dati già registrati (aeroporto di arrivo/destinazione, nazionalità, motivo del viaggio, …) che aiutano l’addetto nella valutazione della merce.
- Le informazioni sul volo (aeroporto di arrivo/destinazione, nazionalità, motivo del viaggio, …) potrebbero essere entità.
Controlli
- Quando un passeggero attraversa un punto di controllo tutta la merce che possiede viene registrata e controllata da un addetto in servizio
- Durante un controllo su una merce si registra
Apertura, Chiusura, Esito, … ed eventualmente DazioDovuto. - Nei casi di contestazione
dazio dovuto, sequestro, fermo
interviene il funzionario in servizio presso il punto di dogana.
Il diagramma E/R ridisegnato in orizzontale e con più attributi
Note
- Alcuni attributi potrebbero essere delle entità: Esito, Arrivo, Destinazione, Nazionalità, Motivo, …
- Chiusura > Apertura
- Fine > Inizio
- DazioDovuto=Quantità*Dazio, con dazio corrispondente alla categoria di appartenenza della merce
- Esito=NULL in mancanza di contestazione
- Esito={x, y, z} per dazio dovuto, merce sequestrata, proprietario fermato.
SCHEMA RELAZIONALE
- FUNZIONARIO(IDfunzionario, Cognome, Nome, … )
- PUNTOD(IDpuntod, …)
- FUNZIONARIO_PUNTOD(funzionarioID, puntodID, Inizio, Fine, …)
- ADDETTO(IDaddetto,Cognome, Nome, … )
- PUNTOC(IDpuntoc ,.., puntodID)
- ADDETTO_PUNTOC(addettoID, puntocID, Inizio, Fine, …)
- CATEGORIA(IDcategoria, Nome, Dazio)
- MERCE(IDmerce, Descrizione, Quantità, Apertura, Esito, DazioDovuto, …, Chiusura, puntocID, categoriaID, passeggeroID)
- PASSEGGERO(IDpasseggero, Cognome, Nome, …, Arrivo, Destinazione, Nazionalità, Motivo)
Definizione delle relazioni
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
CREATE TABLE MERCE ( IDmerce INT AUTO_INCREMENT, Descrizione VARCHAR(100), Quantità INT, Apertura DATETIME, Esito CHAR(15), DazioDovuto DOUBLE, Chiusura DATETIME, puntocID INT, categoriaID INT, passeggeroID INT, PRIMARY KEY(IDmerce), FOREIGN KEY(puntocID) REFERENCES PUNTOC(IDpuntoc), FOREIGN KEY(categoriaID) REFERENCES CATEGORIA(IDcategoria), FOREIGN KEY(passeggeroID) REFERENCES PASSEGGERO(IDpasseggero) ) |
QUERY
1. Visualizzare i dati di tutti i passeggeri che sono stati controllati in ciascuno dei punti di dogana nell’arco della giornata
1 2 3 4 5 6 |
SELECT PUNTOD.Nome, PUNTOC.Nome, Apertura, PASSEGGERO.* FROM PUNTOD INNER JOIN PUNTOC ON ... INNER JOIN MERCE ON ... INNER JOIN PASSEGGERO ON ... WHERE DATE(Apertura) = CURRENT_DATE() ORDER BY PUNTOD.Nome, PUNTOC.Nome, Apertura |
2. Visualizzare per ciascun punto di controllo l’ammontare dei dazi doganali registrati
1 2 3 |
SELECT puntocID, Sum(DazioDovuto) FROM MERCE GROUP BY puntocID |
3. Calcolare e visualizzare quante merci per ogni categoria sono state respinte dall’inizio dell’anno
1 2 3 4 |
SELECT CATEGORIA.nome, Sum(quantità) FROM MERCE INNER JOIN CATEGORIA ON MERCE.categoriaID = CATEGORIA.IDcategoria WHERE (Esito = Y) AND (YEAR(Fine) = YEAR(CURRENT_DATE()) GROUP BY CATEGORIA.nome |
4. Calcolare e visualizzare quante contestazioni sono state registrate da ciascun addetto
1 2 3 4 5 6 7 |
SELECT IDaddetto, Cognome, Nome, Count(*) FROM ADDETTO INNER JOIN ADDETTO_PUNTOC ON ... INNER JOIN PUNTOC ON ... INNER JOIN MERCE ON ... WHERE Esito IS NOT NULL GROUP BY IDaddetto ORDER BY Cognome, Nome |
5. Calcolare la durata media dei controlli per ogni punto di controllo nell’arco della giornata
1 2 3 4 |
SELECT puntocID, SEC_TO_TIME(AVG((TIME_TO_SEC(TIMEDIFF(Fine,Inizio)))) AS 'Durata media' FROM MERCE WHERE DATE(Chiusura) = CURRENT_DATE() GROUP BY puntocID |
Osserva
- Durata: TIMEDIFF(Fine,Inizio)
- Durata in secondi: TIME_TO_SEC(TIMEDIFF(Fine,Inizio))
- Durata media in secondi: AVG(TIME_TO_SEC(TIMEDIFF(Fine,Inizio)))
- Durata media: SEC_TO_TIME(AVG((TIME_TO_SEC(TIMEDIFF(Fine,Inizio))))
6. Visualizzare l’elenco, in ordine alfabetico, raggruppato per nazionalità, dei passeggeri in stato di fermo, registrati dall’inizio dell’anno in tutti i punti di controllo
1 2 3 4 |
SELECT Nazionalità,PASSEGGERO.*, Chiusura, puntocID FROM ... WHERE (Esito=Z) AND (YEAR(Chiusura) = YEAR(CURRENT_DATE()) ORDER BY Nazionalità, Cognome, Nome |
7. Visualizzare gli addetti in servizio nella giornata, suddivisi per nome del funzionario incaricato
1 2 3 4 5 6 7 8 9 10 |
SELECT FUNZIONARIO.cognome, FUNZIONARIO.nome, ... ADDETTO.cognome, ADDETTO.nome, ... FROM FUNZIONARIO INNER JOIN FUNZIONARIO_PUNTOD ON ... INNER JOIN PUNTOD ON ... INNER JOIN PUNTOC ON ... INNER JOIN ADDETTO_PUNTOD ON ... INNER JOIN ADDETTO ON ... WHERE (FUNZIONARIO_PUNTOD.Inizio = ...) AND (ADDETTO_PUNTOC.Inizio = ...) AND ... ORDER BY FUNZIONARIO.cognome, FUNZIONARIO.nome, ADDETTO.cognome, ADDETTO.nome |