Lo scopo è quello di classificare gli utenti per numerosità famigliare e monitorare la distribuzione di articoli vari(p.e.: viveri, vestiario. etc.).
Le tabelle coinvolte:
- Articoli: contiene tutti gli oggetti distribuiti;
- Persone: anagrafica Utenti;
- ArticoliDistribuzione: articoli distribuiti all'Utente nelle visite periodiche.
Il monitoraggio avviene sui dati del 2025;
Conto le visite per Utente;
Aggrego le quantità degli articoli distribuiti per Utente;
Aggrego per per numerosità famigliare le visite e le quantità degli articoli.
La query è la seguente:
SELECT GenAr.Articolo, GenAr.IDArticolo,
Co1.Visite AS Comp1Visite, Co1.QtaTot AS Comp1QtaTot, Co1.NrInt AS Comp1NrInt
FROM (SELECT *
FROM Articoli
WHERE Tipo = 'Viveri'
) AS GenAr
LEFT JOIN
(SELECT IDArticolo,
SUM(NrVisite) AS Visite, SUM(Qta) AS QtaTot, SUM(Qta)\SUM(NrVisite) AS NrInt
FROM (SELECT IDPersone, [Componenti Familiari] AS Comp, Viv.IDArticolo,
COUNT(DataVisita) AS NrVisite, SUM(QtaPrel) AS Qta
FROM ((SELECT IDPersone, DataVisita, IDArticolo, QtaPrel
FROM ArticoliDistribuzione
WHERE YEAR(DataVisita) = 2025) AS Viv
LEFT JOIN
persone AS Pers
ON Viv.IDPersone = Pers.ID)
GROUP BY IDPersone, [Componenti Familiari], Viv.IDArticolo)
GROUP BY Comp, IDArticolo
HAVING Comp ='1') AS Co1
ON GenAr.IDArticolo = Co1.IDArticolo
Il risultato non è quello che prevedevo, cioè che per ogni articolo presente in Articoli viene assegnato, per classificazione, il numero totale delle visite e la quantità distribuita dell'articolo stesso.
La relazione per codice articolo è del tutto casuale.
Se si sostituisce l'istruzione LEFT JOIN che segue la tabella Articoli con una INNER JOIN tutto funziona perfettamente. Facendo perdere alla tabella Articoli la funzione di controllo.
Si ha un risultato in linea con l'istruzione anche inserendo RIGTH JOIN.
Non capisco come con la LEFT JIN non si riesca ad avere un risultato in linea.