Selezionare dati con LEFT JOIN

di il
9 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.

9 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

  • Re: Selezionare dati con LEFT JOIN

    Mi sembra che così sia tutto più semplice:

    SELECT Articoli.IDArticolo, Articoli.Articolo, Articoli.Tipo, Count(ArticoliDistribuzione.IDPersone) AS ConteggioDiIDPersone, Sum(ArticoliDistribuzione.QtaPrel) AS SommaDiQtaPrel, Sum(Persone.[Componenti Familiari]) AS [SommaDiComponenti Familiari]
    FROM (ArticoliDistribuzione RIGHT JOIN Articoli ON ArticoliDistribuzione.IDArticolo = Articoli.IDArticolo) LEFT JOIN Persone ON ArticoliDistribuzione.IDPersone = Persone.ID
    WHERE (((Articoli.Tipo)=Nz([Ricerca per Tipo],[Tipo])) AND ((Persone.[Componenti Familiari])=Nz([Ricerca per Componenti Familiari],[Componenti Familiari])))
    GROUP BY Articoli.IDArticolo, Articoli.Articolo, Articoli.Tipo;

    e ti permette eventualmente di filtrare dinamicamente per Tipo e Componenti Familiari inserendo i dati di ricerca nelle finestre di richiesta:

    • se non digiti niente ti farà vedere tutti gli Articoli 
    • se digiti il Tipo ti farà vedere tutti gli Articoli che hanno quel Tipo
    • se digiti i Componenti Familiari ti farà vedere tutti gli Articoli relazionati alle Persone che hanno quei Componenti Familiari
    • se digiti il Tipo e i Componenti Familiari ti farà vedere tutti gli Articoli che hanno quel Tipo e relazionati alle Persone che hanno quei Componenti Familiari
  • Re: Selezionare dati con LEFT JOIN

    18/01/2026 - Stifone ha scritto:

    Mi sembra che così sia tutto più semplice:

    Non credo sia quello che vorrebbe fare.

    Se parla di left join vuole vedere tutti gli articoli divisi per categoria e ordinati per quantità prelevate per famiglia a loro volta ordinati per nuclei.

    Avevo chiesto

    16/01/2026 - sihsandrea ha scritto:

    I nomi dei campi essenziali?

    Ma alla tabella articoli viene coinvolto il genere di articolo: anche quello è essenziale visto che lo usi nella query.

    Mostra i dati fittizi delle tabelle e il risultato che vuoi ottenere, magari ti manca qualche campo cruciale da aggiungere per fare quello che ti serve.

  • Re: Selezionare dati con LEFT JOIN

    20/01/2026 - sihsandrea ha scritto:

    Se parla di left join vuole vedere tutti gli articoli divisi per categoria e ordinati per quantità prelevate per famiglia a loro volta ordinati per nuclei.

    Detta in altre parole. per categoria ordinati per Articolo con la quantità ritirata.

    20/01/2026 - sihsandrea ha scritto:

    Non credo sia quello che vorrebbe fare.

    Non si riesce a calcolare la quantità  ritirata per articolo dalla Categoria.

    il problema è voler usare la tabella Articoli come controllo degli elementi presenti nella categoria.

    Il risultato finale doveva essere:

     Componenti 1Componenti 2Componenti 3Componenti 4Componenti 5Componenti 6
    AlimentiVisite TotaliQuantità TotaleNr. Consegnati VisitaVisite TotaliQuantità TotaleNr. Consegnati VisitaVisite TotaliQuantità TotaleNr. Consegnati VisitaVisite TotaliQuantità TotaleNr. Consegnati VisitaVisite TotaliQuantità TotaleNr. Consegnati VisitaVisite TotaliQuantità TotaleNr. Consegnati Visita
    Biscotti1091101181813738122111116211
    Biscotti infanzia      111      111

    I dati sono estratti con il codice:

    SELECT Comp, Art.IDArticolo, Art.Articolo, Visite, QtaTot, Media
    FROM 
    (
    SELECT Comp, IDArticolo, Articolo, SUM(NrVisite) AS Visite, SUM(Qta) AS QtaTot, SUM(Qta)\SUM(NrVisite) AS Media
    FROM(SELECT Aggr.IDPersone, 'Componenti ' & [Componenti Familiari] AS Comp, IDArticolo, Articolo,
                     NrVisite, Qta
        FROM (SELECT IDPersone, Distr.IDArticolo, Articolo,
                     NrVisite, Qta
              FROM (SELECT IDPersone, IDArticolo, COUNT(DataVisita) AS NrVisite, SUM(QtaPrel) AS Qta
                    FROM (SELECT IDPersone, DataVisita, IDArticolo, QtaPrel
                          FROM ArticoliDistribuzione
                          WHERE YEAR(DataVisita) = 2025)
                    GROUP BY IDPersone, IDArticolo) AS Distr
                    RIGHT JOIN
                    (SELECT *
                     FROM Articoli
                     WHERE Tipo='Viveri')AS Art
                       ON Distr.IDArticolo = Art.IDArticolo) AS Aggr
             LEFT JOIN
             persone AS Pers
                ON Aggr.IDPersone = Pers.ID)
    GROUP BY Comp, IDArticolo, Articolo
    ORDER BY Comp, Articolo
    )
    AS Com1
    RIGHT JOIN
    (SELECT *
    FROM Articoli
    WHERE Tipo = 'Viveri') AS Art
      ON Art.IDArticolo = Com1.IDArticolo
    ;
    

     Non sono riuscito con sql a far diventare la categoria intestazione di colonna.
    Intanto ho risolto esportando in Excel i dati e con una tabella pivot sono arrivato al risultato che ti ho mostrato.

    Ma riuscirò ad imparare come fare la stessa cosa con sql.

    Intanto grazie della pazienza, spero di farti avere la soluzione senza ulteriori post.

    Saluti

  • Re: Selezionare dati con LEFT JOIN

    Cambio la vista da Excel, quella inserita in precedenza creava confusione

    Questo mi sembra più comprensibile

    Alla prossima

  • Re: Selezionare dati con LEFT JOIN

    Dai un'occhiata a questo

    https://support.microsoft.com/it-it/topic/migliorare-la-leggibilit%C3%A0-dei-dati-di-riepilogo-utilizzando-una-query-a-campi-incrociati-8465b89c-2ff2-4cc8-ba60-2cd8484667e8

  • Re: Selezionare dati con LEFT JOIN

    Questa soluzione non mi era venuta in mente, per le statistiche ho sempre preparato le basi dati.

    Interessante, ho da studiare.

    Cerco di arrivare ad un risultato che posterò.

    Grazie

    A presto

  • Re: Selezionare dati con LEFT JOIN

    Penso di aver studiato, non so quanto ho capito.

    Ho creato la tabella "TestPivot" con la query oggetto del primo post.
    Il tentativo di riprodurre il risultato ottenuto con il passaggio tramite Excel è fallito. 

    21/01/2026 - Pensionato ha scritto:

    Quello che mette a disposizione la query a campi incrociati di Access permette, almeno per quello che ho sperimentato, di associare un solo valore calcolato(p.e.: Visite) alla classe interessata.

    Il codice scritto:

    TRANSFORM Sum(TestPivot.[Visite]) AS SommaDiVisite
    SELECT
       TestPivot.[Articolo]
    FROM
       TestPivot
    GROUP BY
       TestPivot.[Articolo] 
    PIVOT TestPivot.[Comp];

    La possibilità di inserire altri campi nella TRANSFORM sarebbe la soluzione.

Devi accedere o registrarti per scrivere nel forum
9 risposte