Esercizio no.1:soluzione
Si profilano due entità: gli ordini (O) e l'entità impiegati (I) ; quest'ultima deve essere correlate alla precedente; ricordiamo che ogni impiegato può seguire più ordini ed ogni ordine può essere seguito da un solo impiegato. Si tratta di una relazione 1:n (uno-molti).
La tabella degli impiegati sarà caratterizzata dal seguente tracciato
dei campi:
|
CREATE TABLE I( idI COUNTER PRIMARY KEY, nome CHAR(20), livello INTEGER); |
La tabella degli ordini dovrà contenere la chiave esterna che ci possa ricondurre al'impiegato che segue quello specifico ordine.
|
CREATE TABLE O( idO COUNTER PRIMARY KEY, cliente CHAR(20), data date, importo INTEGER, xidI INTEGER REFERENCES I(idI)); |
Ne deriva il seguente diagramma logico: tra le tabelle:
adesso popoliamo il database, per fortuna non sono molti record.
I | ||
idI | nome |
livello
|
1 | bianchi |
3
|
2 | rossi |
4
|
3 | verdi |
2
|
4 | neri |
2
|
5 | ciano |
3
|
6 | rosa |
5
|
O | ||||
idO | cliente | data | importo | xidI |
1 | VOLVO | 01/01/2014 | 1000 | 1 |
2 | BMW | 01/02/2014 | 2400 | 1 |
3 | FIAT | 15/01/2014 | 1500 | 6 |
4 | FORD | 15/02/2014 | 1000 | 6 |
5 | NISSAN | 12/03/2014 | 1200 | 6 |
6 | FIAT | 07/02/2014 | 800 | 2 |
7 | NISSAN | 03/02/2014 | 2600 | 3 |
8 | SKODA | 04/02/2014 | 1400 | 3 |
9 | FIAT | 02/04/2014 | 1100 | 3 |
10 | BMW | 15/04/2014 | 2000 | 4 |
11 | RENAULT | 04/05/2014 | 1500 | 4 |
12 | NISSAN | 15/05/2014 | 1750 | 5 |
13 | VOLVO | 18/02/2014 | 3000 | 5 |
q1: Elenca i dipendenti che seguono uno specifico cliente ( nel nostro caso FIAT). |
|||||
SELECT I.nome FROM I, O WHERE i.idI=O.xidI And O.cliente='FIAT'; |
|
q2: Elenca gli ordini seguiti da uno specifico operatore (nel nostro caso 'bianchi'). |
||||
SELECT O.cliente FROM I, O WHERE i.idI=O.xidI And I.nome='Bianchi'; |
|
q3: Fai un elenco dei clienti indicando la loro spesa complessiva in ordine decrescente. |
|||||||||||||||||
SELECT O.cliente, SUM(O.importo) AS TOT FROM I, O WHERE i.idI=O.xidI GROUP BY O.cliente ORDER BY SUM(O.importo) DESC; |
|
q4: Fai un elenco dei livelli indicando per ogni livello quanti ordini sono seguiti. |
|||||||||||
SELECT I.livello, COUNT(O.xidI) AS
CONTA FROM I, O WHERE i.idI=O.xidI GROUP BY livello; |
|
q5: Fai l'elenco degli ordini di febbraio e degli impiegati che li seguono. |
|
SELECT O.cliente, O.data, I.nome FROM I, O WHERE i.idI=O.xidI AND data<#3/1/14# AND data>#1/31/14#; |
N.B.come le date debbano riferirsi col formato mm.gg.aa |
cliente | data | nome |
BMW | 01/02/2014 | bianchi |
FORD | 15/02/2014 | rosa |
FIAT | 07/02/2014 | rossi |
NISSAN | 03/02/2014 | verdi |
SKODA | 04/02/2014 | verdi |
VOLVO | 18/02/2014 | ciano |
q6: Elenca gli impiegati e l'importo complessivo degli ordini che hanno gestito. |
|||||||||||||||
SELECT I.nome, SUM(O.importo) AS TOT
FROM I, O WHERE i.idI=O.xidI GROUP BY I.nome ORDER BY SUM(O.importo) DESC; |
|
q7: Fai un elenco dei livelli indicando per ogni livello la somma degli importi gestiti. |
|||||||||||
SELECT I.livello, SUM(O.importo) AS
CONTA FROM I, O WHERE i.idI=O.xidI GROUP BY livello ORDER BY SUM(O.importo) DESC; |
|
q8: Elenca gli impiegati e la quantità di ordini che hanno gestito. |
|||||||||||||||
SELECT I.nome, COUNT(O.xidI) AS TOT
FROM I, O WHERE i.idI=O.xidI GROUP BY I.nome ORDER BY COUNT(O.xidI) DESC; |
|