Esercizio no.9:soluzione
|
ad ogni trasporto corrisponde un cliente. un cliente può ordinare più trasporti |
|
|
ad ogni trasporto corrisponde un solo automezzo un automezzo può effettuare più trasporti |
|
Sembra sicura una prima bozza del diagramma; rimane da includere l'entità autisti nello schema precedente.

Come si nota dalla figura la relazione che intercorre fra le entità mezzi e l'entità autisti è una relazione molti-molti, la relazione guida può essere interpretata e sostituita dall'entità trasporto.

questa scelta ci consente di definire in maniera univoca quale autista guidando un dato mezzo ha eseguito un certo trasporto

Per comodità, poniamo:
T=Trasporti
M=Mezzi
C=Clienti
A=Autisti
ecco come si dovrebbe presentare il diagramma concettuale finale

si può impostare il seguente tracciato dei campi:
| C | |||
| Nome campo | Tipo di dati | parametri | |
| ∇ | IdC | contatore | Chiave primaria |
| rs | testo | ||
| M | |||
| Nome campo | Tipo di dati | parametri | |
| ∇ | idM | contatore | Chiave primaria |
| tipo | testo | ||
| maxpeso | numerico | Intero | |
| A | |||
| Nome campo | Tipo di dati | Parametri | |
| ∇ | idA | contatore | Chiave primaria |
| Cognome | testo | ||
| T | |||
| Nome campo | Tipo di dati | Parametri | |
| ∇ | idT | contatore | Chiave primaria |
| xida | numerico | Intero lungo | |
| xidm | numerico | Intero lungo | |
| xidc | numerico | Intero lungo | |
| partenza | testo | ||
| arrivo | testo | ||
| peso | numerico | Intero | |
| data | data/ora | data in cifre | |
ottenendo il seguente diagramma logico

Queste sono le query di creazione e il contenuto delle tabelle
| CREATE TABLE C( idC COUNTER PRIMARY KEY, rs char(20) ); |
|
| CREATE TABLE M( idM COUNTER PRIMARY KEY, tipo CHAR(20), maxpeso INTEGER ); |
|
| CREATE TABLE A( idA COUNTER PRIMARY KEY, cognome CHAR(20) ); |
|
Infine
CREATE TABLE T(
idT COUNTER PRIMARY KEY,
partenza CHAR(20),
arrivo CHAR(20),
peso INTEGER,
data DATE,
xidC INTEGER REFERENCES C(idC),
xidM INTEGER REFERENCES M(idM),
xidA INTEGER REFERENCES A(idA)
);
| idT | partenza | arrivo | peso | data |
xidC
|
xidM
|
xidA
|
| 1 | milano | varese | 1500 | 09/03/2015 |
2
|
1
|
4
|
| 2 | milano | como | 9000 | 05/09/2015 |
7
|
4
|
1
|
| 3 | novara | pavia | 200 | 07/07/2015 |
6
|
2
|
2
|
| 4 | pavia | milano | 3500 | 05/08/2015 |
5
|
3
|
5
|
| 5 | como | bergamo | 900 | 07/04/2015 |
2
|
5
|
4
|
| 6 | varese | milano | 8000 | 07/01/2015 |
1
|
4
|
3
|
| 7 | como | milano | 4500 | 12/12/2015 |
4
|
3
|
5
|
| 8 | bergamo | milano | 7000 | 15/11/2015 |
7
|
4
|
2
|
| 9 | milano | bergamo | 200 | 27/08/2015 |
3
|
2
|
1
|
| 10 | pavia | como | 100 | 01/09/2015 |
6
|
2
|
4
|
| 11 | varese | novara | 3500 | 02/03/2015 |
2
|
3
|
3
|
| 12 | milano | novara | 6000 | 04/06/2015 |
1
|
5
|
5
|
|
q1:Elencare tutti i trasporti eseguiti partendo da una specifica località (nel nostro caso, Milano) |
|||||||||||||||||||||
| SELECT T.idT, T.partenza,
T.arrivo, T.data FROM T WHERE T.partenza='milano'; |
|
||||||||||||||||||||
|
q2:Elencare i trasporti, i clienti e gli autisti effettuati fra due specifiche date (nel nostro caso, fra il 1/3/15 e il 1/6/15 ) |
|||||||||||||
| SELECT T.idT, C.rs, A.cognome
FROM T, C, A WHERE A.idA=T.xidA AND C.idC=T.xidC AND T.data<#6/1/15# AND T.data>=#3/1/15#; |
|
||||||||||||
|
q3:Elencare tutti gli autisti che abbiano effettuato più di 2 trasporti |
|||||||
| SELECT A.cognome, COUNT(*)
AS Viaggi FROM T, A WHERE A.idA=T.xidA GROUP BY A.cognome HAVING COUNT(*)>2; |
|
||||||
|
q4:Elencare tutti i clienti con la relativa somma in peso della merce consegnata |
|||||||||||||||||
| SELECT C.rs, SUM (T.peso)
AS peso FROM C, T WHERE C.idC=T.xidC GROUP BY C.rs; |
|
||||||||||||||||
|
q5:Calcolare la somma in peso dei trasporti effettuati per BMW |
|||
| SELECT SUM (T.peso) AS
peso FROM C, T WHERE C.idC=T.xidC AND C.rs='BMW'; |
|
||
|
q6:Ricavare il tipo di mezzo usato più di frequente |
|||||||||
| SELECT TOP 1 M.tipo,
COUNT (*) FROM M, T WHERE M.idM=T.xidM GROUP BY M.tipo ORDER BY COUNT(*) DESC; |
|
||||||||
edutecnica