AS
Data Retrieval
Part 2
In questa seconda parte complico un po' le cose con un maggior focus sul linguaggio SQL.
Rispetto alla prima parte, prendo in considerazione una ulteriore tabella, la tbl_clienti, e approdo ad un report finale che mostri, per ciascun venditore, il valore dell'ordinato per ogni cliente della propria zona.
Quantificherò l'eventuale fuori zona, ovvero il valore degli ordini effettuati sul proprio territorio da altri colleghi.
Siccome voglio vedere tutti i clienti, anche nel caso in cui non risulti alcun ordine affatto, dovrò utilizzare una sottoquery (subquery o query interna).
Per chiarezza, espongo prima il contenuto delle tre tabelle.
Di seguito anche il codice HTML/PHP in quanto leggermente differente rispetto alla prima parte. Diciamo infatti che desidero stamparle nella loro interezza, senza richiamare esplicitamente i campi interessati o che siano essi indeterminati.
<table>
<?php
// print field names
$sql = "SHOW COLUMNS FROM tbl_clienti";
if($result = mysqli_query($conn,$sql))
{
echo "<tr >";
while($row = mysqli_fetch_array($result))
{
echo "<td>" . $row['Field'] . "";
}
echo "</tr>";
// print values
$sql = "SELECT * FROM tbl_clienti;";
if($result = mysqli_query($conn, $sql))
{
while ($row = mysqli_fetch_row($result))
{
echo "<tr>";
foreach($row as $cell)
{
echo "<td>$cell</td>";
}
echo "</tr>";
}
}
}
?>
</table>
tbl_venditori
id_venditorenomecognomearea
1AmbrogioRossiLombardia
2ElenaMarangonVeneto
3MimmoRossiCampania
4MariaParodiLiguria
tbl_ordini
id_ordineid_venditoreesercizioperiodoimportoid_cliente
1320191956.004
24201921050.229
312019146.123
4220191889.336
5220192879.007
6120192564.003
7320193321.005
8320193645.664
91201943213.332
10220194789.337
11220193945.226
12420195987.339
1342019475.991
144201951055.009
15220193987.006
163201951104.002
17420191987.009
tbl_clienti
id_clientedenominazioneprovid_venditore
1Cave Trivelloni srlMS4
2Elettromeccanica Rossi sncMI1
3Officina meccanica Bianchi srlPV1
4Selciatori AssociatiNA3
5Antico SaponificioCE3
6Panificio MinzonVE2
7Trasporti Furlan & F.lliTV2
8General BrambillaMI1
9Greentech SpaGE4
10Coop TigullioLI4
Comincio a scrivere la subquery.
Voglio tutti i recordset della tbl_clienti, quindi uso un LEFT JOIN.
La colonna "di cui f.z." è un campo calcolato che rappresenta l'eventuale quota di "valore" dove l'id_venditore indicato nell'ordine è differente dall'attribuzione indicata nella tbl_clienti.
SELECT C.id_cliente, C.denominazione, C.id_venditore, sum(V.importo) AS valore,
sum(CASE WHEN C.id_venditore<>V.id_venditore THEN V.importo ELSE 0 END) AS fuoriz
FROM tbl_clienti C
LEFT JOIN tbl_ordini V
ON C.id_cliente=V.id_cliente
GROUP BY C.id_cliente;
Query interna
id_cliente denominazione id_venditore valore di cui f.z.
1Cave Trivelloni srl4EUR 75,99
2Elettromeccanica Rossi snc1EUR 4.317,33EUR 1.104,00
3Officina meccanica Bianchi srl1EUR 610,12
4Selciatori Associati3EUR 1.601,66
5Antico Saponificio3EUR 321,00
6Panificio Minzon2EUR 2.821,55
7Trasporti Furlan & F.lli2EUR 1.668,33
8General Brambilla1
9Greentech Spa4EUR 4.079,55
10Coop Tigullio4
A questo punto scrivo la query esterna (in verde), che รจ una normale SELECT messa in JOIN con la subquery (in viola) anziché con una tabella.
SELECT V.area, V.cognome, V.nome, CONCAT('(', SQ.id_cliente, ') ', SQ.denominazione) as cliente, SQ.valore, SQ.fuoriz
FROM tbl_venditori V
INNER JOIN
(SELECT C.id_cliente, C.denominazione, C.id_venditore, sum(O.importo) AS valore,
sum(CASE WHEN C.id_venditore<>O.id_venditore THEN O.importo ELSE 0 END) AS fuoriz
FROM tbl_clienti C
LEFT JOIN tbl_ordini O
ON C.id_cliente=O.id_cliente
GROUP BY C.id_cliente) SQ
ON V.id_venditore=SQ.id_venditore
ORDER BY V.area, V.cognome, SQ.denominazione;
Query finale
area cognome nome cliente valore fuoriz
CampaniaRossiMimmo(5) Antico SaponificioEUR 321,00
CampaniaRossiMimmo(4) Selciatori AssociatiEUR 1.601,66
LiguriaParodiMaria(1) Cave Trivelloni srlEUR 75,99
LiguriaParodiMaria(10) Coop Tigullio
LiguriaParodiMaria(9) Greentech SpaEUR 4.079,55
LombardiaRossiAmbrogio(2) Elettromeccanica Rossi sncEUR 4.317,33EUR 1.104,00
LombardiaRossiAmbrogio(8) General Brambilla
LombardiaRossiAmbrogio(3) Officina meccanica Bianchi srlEUR 610,12
VenetoMarangonElena(6) Panificio MinzonEUR 2.821,55
VenetoMarangonElena(7) Trasporti Furlan & F.lliEUR 1.668,33