in
La comunità italiana dedicata a Sviluppatori e Architetti IT delle piattaforme Windows

Join su stessa tabella

Ultimo messaggio ricevuto il 23-10-2006 22.15 da roverso. 4 risposta(e).
Pagina 1 di 1 (5 elemento/i)
Ordina messaggi: Precedente Successivo
  • 10-10-2006 21.52

    • roverso
    • Utente Top 25
    • Registrato il 11-10-2004
    • Padova
    • Messaggi 52

    Join su stessa tabella

    Salve a tutti!!
    Purtroppo la mia conoscenza di SQL in Access è limitata e non riesco a trovare una query che mi soddisfi un'estrapolazione di dati da una tabella.
    Vi sottopongo il mio dilemma sperando che qualcuno possa darmi un aiutino.
    Questa è la tabella in questione
    Tab Tab
    ID Nome Numero Anno
    1 A 10 2005
    2 B 15 2005
    3 C 18 2005
    4 D 8 2005
    5 A 13 2006
    6 B 2 2006
    7 D 3 2006
    8 A 1 2006

    Ho bisogno di creare una query che mi restituisca una tabella composta dai campi Nome, SommaAnno2005, SommaAnno2006; le somme sono fatte in base al nome.
    Un esempio del risultato che dovrei ottenere è questo:

    Nome   SommaAnno2005   SommaAnno2006
    A                      10                           14
    B                      15                             2
    C                      18                             0
    D                        8                             3

    In pratica devo ricavarmi la somma di tutti i record con lo stesso nome per l'anno 2005 e 2006 (in questo esempio) anche se uno dei nomi non ha record corrispondenti in uno dei due anni.

    La mia idea era quella di fare un full outer join fra due select differenti per anno della stessa tabella.
    Il problema è che poi la somma non mi veniva corretta, infatti alcuni record si duplicavano.

    Da dire che Access è sprovvisto del Full Outer join e si dovrebbe sostituire con una Union su un Left join e un right join...ma qui mi sono perso...!

    Grazie dell'aiuto!
    • Log
  • 11-10-2006 14.06 In risposta a

    Re: Join su stessa tabella

    Il problema che poni non è affatto banale, soprattutto viste le limitazioni che Access impone. In un database più "robusto" questa necessità si poteva affrontare più semplicemente e rapidamente ricorrendo all'uso di tabelle temporanee o funzioni UDF.

    Quello che segue è uno script realizzato con SQL Server. Dovresti riuscire ad adattare l'istruzione SQL di selezione al tuo caso senza troppa difficoltà:

    create table #t(
    ide int identity(1,1) primary key,
    nome varchar(255) ,
    numero int,
    anno int
    )

    insert #t select 'A', 10, 2005
    insert #t select 'B', 15, 2005
    insert #t select 'C', 18, 2006
    insert #t select 'D', 8, 2005
    insert #t select 'A', 13, 2006
    insert #t select 'B', 2, 2006
    insert #t select 'D', 3, 2006
    insert #t select 'A', 1, 2006

    select isnull(t.nome, t2.nome) as nome, isnull(t.numero, 0) as anno_2005, isnull(t2.numero, 0) as anno_2006
    from (select * from #t where anno=2005) t
    full outer join (select nome, sum(numero) as numero, anno from #t group by nome, anno having anno=2006) t2
    on t.nome = t2.nome


    drop table #t
    • Log
  • 12-10-2006 12.32 In risposta a

    • roverso
    • Utente Top 25
    • Registrato il 11-10-2004
    • Padova
    • Messaggi 52

    Re: Join su stessa tabella

    Mille grazie per la risposta! Sicuramente non sarei stato in grado di trovare risposta da solo.

    Se ho capito bene, isnull(t.nome,T2.nome) as nome, se trova un valore nullo, preleva il nome da una delle due tabelle in cui il nome non è nullo?

    Poi ho un secondo problema: come fare il full outer join in Access. Come dicevo ho tentato di implementarlo facendo un union fra un rightjoin e un leftjoin, ma senza risultato!

    Proverò di nuovo alla luce dei tuoi suggerimenti!

     

    Grazie ancora!

    • Log
  • 12-10-2006 16.31 In risposta a

    Re: Join su stessa tabella

    isnull(t.nome,T2.nome) significa:
    SE t.nome è nullo ALLORA prendi il valore di t2.nome


    FULL OUTER JOIN dovrebbe essere supportato anche da Access.
    • Log
  • 23-10-2006 22.15 In risposta a

    • roverso
    • Utente Top 25
    • Registrato il 11-10-2004
    • Padova
    • Messaggi 52

    Re: Join su stessa tabella

    Dopo tanto rispondo...ho avuto problemi di connessione!

    Purtroppo il full outer join non è disponibile con Access...ma solo con sql server.
    Come dicevo precedentemente ho letto che si può ovviare alla mancanza usando un RightJoin con Union ad un LeftJoin...ma devo ancora provarlo!

    Mi apre che anche l'istruzione isnull(t.nome,T2.nome) non sia possibile implementarla in access...uff è ora che cambi DB Smile !

    Ti saprò dire se riesco a risolvere!

    Ciao e grazie!
    • Log
Pagina 1 di 1 (5 elemento/i)
Prelevato da http://www.devspy.com/forums/p/4281/5018.aspx
DevSpy.com 6.0 © 2001-2008 - Alcuni Diritti Riservati
Salvo diversa indicazione, tutti i contenuti sono pubblicati sotto licenza "Creative Commons Attribution-Share Alike 3.0"