Esercizio no.4:soluzione
Il contesto sembra chiaro un cliente pò effettuare (nel tempo)
pi ordini.
Un ordine può fare riferimento ad un solo cliente.
In un ordine possono essere acquistati più prodotti.
Un prodotto può essere acquistato in molteplici ordini.
Essendoci una relazione n:n fra gli ordini e i prodotti, effettuiamo una ulteriore derivazione, introducendo la tabella Distinta (D).
Se volessimo definire i campi per la tabella Clienti (C).
idC Contatore nome Testo |
CREATE TABLE C ( idC COUNTER PRIMARY KEY, nome CHAR(20)); |
Se volessimo definire i campi per la tabella Prodotti (P)
idP Contatore prz Numerico prd Testo |
CREATE TABLE P ( idP COUNTER PRIMARY KEY, prz INTEGER, prd CHAR(20)); |
Se volessimo definire i campi per la tabella Ordini (O):
idO Contatore data Date xidC Numerico |
CREATE TABLE O( idO COUNTER PRIMARY KEY, data date, xidC INTEGER REFERENCES C(idC)); |
Questa ultima la chiave esterna per idC.
Se volessimo definire i campi per la tabella Distinta (D)
idD Contatore xidP Numerico xidO Numerico qta Numerico |
CREATE TABLE D( idD COUNTER PRIMARY KEY, qta INTEGER , xidP INTEGER REFERENCES P(idP), xidO INTEGER REFERENCES O(idO)); |
Si deriva il modello logico e poi possiamo popolare le tabelle con
valori di test
|
|
|
|
q1: Elenco degli ordini effettuati dalla da uno specifico clinente ( BMW). |
|||||||||
SELECT O.idO, O.data FROM O, C WHERE C.idC=O.xidC AND C.nome='BMW'; |
|
q2: Elenco dei clienti che comprano uno specifico prodotto (manovelle). |
||||||
SELECT C.nome FROM O, C, D, P WHERE C.idC=O.xidC AND O.idO=D.xidO AND P.idP=D.xidP AND P.prd='manovella'; |
|
q3: Elenco degli ordini e dei rispettivi clienti con importo complessivo organizzato per importo. |
||||||||||||||||||||||||||||||||||||||||
SELECT C.nome, O.idO,
SUM(D.qta*P.prz) AS TOT FROM O, C, D, P WHERE C.idC=O.xidC AND O.idO=D.xidO AND P.idP=D.xidP GROUP BY O.idO, C.nome ORDER BY SUM(D.qta*P.prz) DESC; |
|
q4: Indica il numero e la data di tutti gli ordini dove stato venduto uno specifico prodotto (bielle) e il numero di pezzi venduti. |
||||||||||||||||
SELECT O.idO, O.data, D.qta FROM O, D, P WHERE O.idO=D.xidO AND P.idP=D.xidP AND P.prd='biella'; |
|
q5: Elenca i clienti indicando quanti ordini hanno effettuato, |
|||||||||||
SELECT C.nome, COUNT(*)
AS TOT FROM O, C WHERE C.idC=O.xidC GROUP BY C.nome; |
|
q6: Elenca i clienti indicando il quantitativo di pezzi acquistato. |
|||||||||||
SELECT C.nome, SUM(D.qta)
AS TOT FROM O, C, D WHERE C.idC=O.xidC AND O.idO=D.xidO GROUP BY C.nome ORDER BY SUM(D.qta) DESC; |
|