PDA

View Full Version : [MySQL] Realizzare query su più tabelle


Mozaic83
23-05-2011, 21:54
Ciao a tutti,
ho iniziato da poco lo studio di SQL e mi sono bloccato sulla realizzazione di una query fatta su più tabelle

Sto esercitandomi in locale su MySQL server (5.1.54-1ubuntu4)

Ho creato un database e ho inserito 3 tabelle (Clienti - Ordini - Dettagli_Ordine).
E' un esempio che ho costruito io, prendendo spunto da un testo.

- Clienti (IDcliente, nome_cli, indirizzo, città, provincia, cap)
=> Primary Key IDcliente

- Ordini (IDordine, IDcliente, data_spedizione, stato_sped, num_sped, corriere)
=> Primary Key IDordine - Foreign Key IDcliente verso Clienti.IDcliente

- Dettagli_Ordine (IDordine, IDarticolo, num_pezzi, costo_pezzo)
=> Foreign Key IDordine verso Ordini.IDordine

La tabella Dettagli_Ordine può contenere più volte la stessa voce IDordine, perchè un ordine può essere la somma di più articoli

>select * from Dettagli_Ordine;
+----------+------------+--------------+--------------+
| IDordine | IDarticolo | num_pezzi | costo_pezzo |
+----------+------------+--------------+--------------+
| 1 | art210 | 25 | 10.00|
| 1 | art401 | 50 | 2.55 |
+----------+------------+--------------+------------+

Vorrei essere in grado di vedere una tabella con questi risultati:
nome_cli - IDordine - ImportoTotaleOrdine

esempio
cliente1 - 1 - 377.50 ===> ((25pezzi dell'art210 a 10 cad)+(50pezzi dell'art401 a 2.55cad))

E' possibile ?

Io avevo pensato a questa query con una tabella derivata (nome tcalc)

SELECT tcalc.* FROM (SELECT Ordini.IDcliente AS 'Codice Cliente', Ordini.IDordine AS 'Codice Ordine',
SUM(Dettagli_Ordine.num_pezzi * Dettagli_Ordine.costo_pezzo) AS 'Totale Ordine'
FROM Ordini, Dett_Ord WHERE Ordini.IDordini=Dett_Ord.IDordini ) AS tcalc;

ma appunto mi mette solo il Codice Cliente e non il suo nome e non riesco a mettere giù il collegamento tra la tabella virtuale e la tabella Clienti (tra l'altro si può fare o è proprio sbagliata in partenza la query ?)

Gimli[2BV!2B]
24-05-2011, 00:34
Tutti i dati:SELECT Clienti.nome_cli, Ordini.IDordine, Dettagli_Ordine.IDarticolo, Dettagli_Ordine.num_pezzi * Dettagli_Ordine.costo_pezzo AS ImportoRiga
FROM Clienti
INNER JOIN Ordini
ON Clienti.IDcliente = Ordini.IDcliente
INNER JOIN Dettagli_Ordine
ON Ordini.IDordine = Dettagli_Ordine.IDordineRaggruppamento su IDordine con somma costo * qtà (quello che cerchi):SELECT Clienti.nome_cli, Ordini.IDordine, SUM( Dettagli_Ordine.num_pezzi * Dettagli_Ordine.costo_pezzo ) AS ImportoTotaleOrdine
FROM Clienti
INNER JOIN Ordini
ON Clienti.IDcliente = Ordini.IDcliente
INNER JOIN Dettagli_Ordine
ON Ordini.IDordine = Dettagli_Ordine.IDordine
GROUP BY IDordineMostrando ordini vuoti:SELECT Clienti.nome_cli, Ordini.IDordine, SUM( Dettagli_Ordine.num_pezzi * Dettagli_Ordine.costo_pezzo ) AS ImportoTotaleOrdine
FROM Clienti
INNER JOIN Ordini
ON Clienti.IDcliente = Ordini.IDcliente
LEFT OUTER JOIN Dettagli_Ordine
ON Ordini.IDordine = Dettagli_Ordine.IDordine
GROUP BY IDordineMostrando anche clienti che non hanno fatto ordini:SELECT Clienti.nome_cli, Ordini.IDordine, SUM( Dettagli_Ordine.num_pezzi * Dettagli_Ordine.costo_pezzo ) AS ImportoTotaleOrdine
FROM Clienti
LEFT OUTER JOIN Ordini
ON Clienti.IDcliente = Ordini.IDcliente
LEFT OUTER JOIN Dettagli_Ordine
ON Ordini.IDordine = Dettagli_Ordine.IDordine
GROUP BY IDordine

Mozaic83
24-05-2011, 09:45
Grazie mille, anche per gli altri esempi !
Rendevo io tutto difficile :doh: