Selezionare dati con LEFT JOIN

di il
2 risposte

Selezionare dati con LEFT JOIN

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.

2 Risposte

  • Re: Selezionare dati con LEFT JOIN

    16/01/2026 - Pensionato ha scritto:

    Le tabelle coinvolte: 
    - Articoli: contiene tutti gli oggetti distribuiti;
    - Persone: anagrafica Utenti;
    - ArticoliDistribuzione: articoli distribuiti all'Utente nelle visite periodiche.

    I nomi dei campi essenziali?

    16/01/2026 - Pensionato ha scritto:

    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.

    Mostra le singole select

    Io ho contato più parentesi aperte che chiuse ma forse per errore mio

    Fai una divisione col back slash?

  • Re: Selezionare dati con LEFT JOIN

    Risposte cominciando dall'alto:
    Nomi dei campi essenziali: 
    tabella Articoli - IDArticolo(chiave univoca)
    tabella Persone - ID(chiave univoca), [Componenti Familiari]
    tabella ArticoliDistribuzione - IDPersone(chiave esterna con Persone), DataVisita, IDArticolo(chiave esterna con Articoli), QtaPrel=quantità prelevata.

    Codice con SELECT evidenziate(spero)

    
    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
    

    Le parentesi dovrebbero essere in numero pari e posizionate al posto giusto.

    La divisione con back slash per avere il risultato arrotondato all'intero più vicino

Devi accedere o registrarti per scrivere nel forum
2 risposte