Unire più tabelle per creare un recordset

di il
5 risposte

Unire più tabelle per creare un recordset

Salve,
ho 2 tabelle, una con un elenco completo di prodotti Di cui mi interessa solo una colonna NOME), l'altra con un elenco degli stessi prodotti (ma solitamente non tutti quelli della prima tabella), di cui mi interessa la colonna NOME (per collegarla con la prima), tipo (una lettera, es. A, B, C, D) e quantità.
Vorrei ottenere un recordset con 6 colonne:
NOME - in cui ho tutti i nomi della prima tabella
A - in cui sommo tutte le quantità della seconda tabella che hanno come tipo A
B - in cui sommo tutte le quantità della seconda tabella che hanno come tipo B
C - in cui sommo tutte le quantità della seconda tabella che hanno come tipo C
D - in cui sommo tutte le quantità della seconda tabella che hanno come tipo D
Somma - A+B+C+D
Es:
NOME A B C D SOMMA
MARCO 1 3 5 9
PIERO 1 3 2 6
GIULIO 0
GINO 4 12 10 2 28
BRUNO 0

Ho provato a limitarmi alla sola colonna A, con left join, right join left outer join, right outer join, ecc.... ma mi da sempre (per questo esempio) 3 righe invece di 5 applicando la clausola "where tipo = 'A' " dopo il join e quindi escludendo le righe che non hanno corrispondenza nella seconda tabella.
Qualche consiglio?

5 Risposte

  • Re: Unire più tabelle per creare un recordset

    Ok....domanda troppo complicata...
  • Re: Unire più tabelle per creare un recordset

    BIZIO3D ha scritto:


    Salve,
    ho 2 tabelle, una con un elenco completo di prodotti Di cui mi interessa solo una colonna NOME), l'altra con un elenco degli stessi prodotti (ma solitamente non tutti quelli della prima tabella), di cui mi interessa la colonna NOME (per collegarla con la prima), tipo (una lettera, es. A, B, C, D) e quantità.
    Vorrei ottenere un recordset con 6 colonne:
    NOME - in cui ho tutti i nomi della prima tabella
    A - in cui sommo tutte le quantità della seconda tabella che hanno come tipo A
    B - in cui sommo tutte le quantità della seconda tabella che hanno come tipo B
    C - in cui sommo tutte le quantità della seconda tabella che hanno come tipo C
    D - in cui sommo tutte le quantità della seconda tabella che hanno come tipo D
    Somma - A+B+C+D
    Es:
    NOME A B C D SOMMA
    MARCO 1 3 5 9
    PIERO 1 3 2 6
    GIULIO 0
    GINO 4 12 10 2 28
    BRUNO 0

    Ho provato a limitarmi alla sola colonna A, con left join, right join left outer join, right outer join, ecc.... ma mi da sempre (per questo esempio) 3 righe invece di 5 applicando la clausola "where tipo = 'A' " dopo il join e quindi escludendo le righe che non hanno corrispondenza nella seconda tabella.
    Qualche consiglio?
    La domanda non è complicata. Eventualmente lo è la soluzione. Dove vuoi ottenere quel risultato? direttamente in una query? Non saprei come fare.
    A - B - C e D possono diventare anche di più? Vuoi che il tutto si aggiorni automaticamente alla presenza di ulteriori Tipi (E, F ecc)?
    L'unico modo flessibile (che quindi supera il fatto di quanti sono i Tipi) o forse l'unico in assoluto è usare Vba, con cicli annidati (ogni nome, ogni tipo), memorizzi il tutto in una tabella temporanea che poi imposti come origine di una maschera in visualizzazione foglio dati (ad esempio).
    Per creare una tabella temporanea prendi spunto da qui http://forum.masterdrive.it/microsoft-office-access-vba-23/vba-usare-ado-come-recordset-disconnessi-in-memoria-48877/
  • Re: Unire più tabelle per creare un recordset

    BIZIO3D ha scritto:


    ok....domanda troppo complicata...
    Macché!
    Al contrario è talmente banale che forse è proprio per questo che nessuno ti ha risposto.
    La query è davvero semplice. Per ottenere la parte 'a destra' si fa così:
    
    SELECT nome, a, b, c, d, (a+b+c+d) AS Somma
    FROM t1
    
    Non ti resta che mettere la tabella Prodotti in LEFT JOIN ed il gioco è fatto.
    Mi sembra strano che tu non ci sia arrivato da solo.
    A meno che tu non ti sia spiegato sufficientemente bene...
    In tal caso, posta la query ed uno schemino dei dati risultanti.
    Serve anche conoscere i dati su cui stai lavorando!

  • Re: Unire più tabelle per creare un recordset

    gibra ha scritto:


    BIZIO3D ha scritto:


    ok....domanda troppo complicata...
    Macché!
    Al contrario è talmente banale che forse è proprio per questo che nessuno ti ha risposto.
    La query è davvero semplice. Per ottenere la parte 'a destra' si fa così:
    SELECT nome, a, b, c, d, (a+b+c+d) AS Somma
    FROM t1
    Non ti resta che mettere la tabella Prodotti in LEFT JOIN ed il gioco è fatto.
    Mi sembra strano che tu non ci sia arrivato da solo.
    A meno che tu non ti sia spiegato sufficientemente bene...
    In tal caso, posta la query ed uno schemino dei dati risultanti.
    Da quanto ho capito io non esiste un campo a, b, c, d ma un campo Tipo, per ogni "nome", che può assumere uno di quei valori. Ho immaginato una situazione del genere
    Nome Tipo Quantità
    MARCO A 5
    MARCO C 1
    PIERO A 10
    PIERO B 7
    GINO B 3
    GINO D 5
    (ovviamente valori tirati a caso, non corrispondono poi con l'esempio di partenza) o magari per ogni nome possono anche esserci più valori di ogni tipo (per capirci l'accoppiata nome-tipo si ripete in più record). (seconda parentesi: perché non riesco a mettere in colonna decentemente? grrrr)
    E se così non è... beh, come le penso complicate io le cose... qualcuno provi a complicarle ancora di più, se ci riesce.
  • Re: Unire più tabelle per creare un recordset

    Philcattivocarattere ha scritto:


    La domanda non è complicata. Eventualmente lo è la soluzione. Dove vuoi ottenere quel risultato? direttamente in una query? Non saprei come fare.
    A - B - C e D possono diventare anche di più? Vuoi che il tutto si aggiorni automaticamente alla presenza di ulteriori Tipi (E, F ecc)?
    L'unico modo flessibile (che quindi supera il fatto di quanti sono i Tipi) o forse l'unico in assoluto è usare Vba, con cicli annidati (ogni nome, ogni tipo), memorizzi il tutto in una tabella temporanea che poi imposti come origine di una maschera in visualizzazione foglio dati (ad esempio).
    Per creare una tabella temporanea prendi spunto da qui http://forum.masterdrive.it/microsoft-office-access-vba-23/vba-usare-ado-come-recordset-disconnessi-in-memoria-48877/
    Forse c'è una soluzione anche via query, anche se un po' articolata.
    In questa proposta faccio riferimento alla tabella con i nomi dei prodotti come T1 con il solo campo Nome e alla tabella con le quantità come T2 con i campi Nome, Tipo e Qta

    1) prodotto cartesiano tra T1 e questa
    SELECT DISTINCT Tipo FROM T2
    a cui attribuisco per comodità l'alias Q1

    2) metti in Q1 in LEFT JOIN con
    SELECT Nome, Tipo, Sum(Qta) As TotQta FROM T2 GROUP BY Nome, Tipo
    a cui attribuisco per comodità l'alias QTOT. I campi di collegamento sono Nome e Tipo.

    3) La query di cui al punto 2 ha 3 campi: Nome, Tipo e TotQta. Su questa fa una query a campi incrociati (l'autocomposizione va più che bene)

    Non so se compare anche la colonna con la somma dei vari Tipi ma penso che si possa lavorarci, altrimenti fai un altro passaggio con quanto suggerito da Gibra.
    Aggiunta del giorno dopo: macché, la fa la somma, la fa.
Devi accedere o registrarti per scrivere nel forum
5 risposte