Join 3 tabelle

di il
16 risposte

Join 3 tabelle

Sono 2 giorni che provo ad uscirne. Devo prlevare dati da 3 tabelle e visualizzarli in una ListView (android).
Ora se nella tabella
Punteggi
non ci sono record tutto funziona bene, altrimenti mi vengono mostrati valori sballati. Avete suggerimenti? In pratica è il secodno LEFT JOIN che crea problemi....Grazie

String sql = "SELECT a._id, a.name_play, a.saldo_play, a.data_play,
SUM(b.point1), SUM(b.point2), SUM(c.field1), SUM(c.field2), b.conto,
c.conto,
FROM Conti a LEFT JOIN Punteggi b ON (a.name_play  =  b.conto)
LEFT JOIN PrelieviPoints c ON (c.conto  =  a.nome_conto)
GROUP BY a.name_play"; 
Cursor cur = db.rawQuery(sql, null);
        while (cur.moveToNext()){
                    Dettaglio d = new Dettaglio();
                    d.id = cur.getString(0);
                    d. name_play = cur.getString(1);
                    d. saldo_play = cur.getDouble(2);
                    d. data_play = cur.getString(3);
                    d. point1 = cur.getDouble(4);
                    d. point2 = cur.getDouble(5);   
                    d.field1 = cur.getDouble(6);
            Log.d("", "check: "+d.field1);
                    d. field2 = cur.getDouble(7);
                    d. conto = cur.getString(8);
                    d. conto1 = cur.getString(9);
}
        cur.close();
        db.close();

16 Risposte

  • Re: Join 3 tabelle

    Ciao,

    inanzitutto forse è opportuno indicare il dbms con il quale stai lavorando (mysql?)

    Tornando al problema, leggo:
    SELECT ... b.conto,c.conto
    FROM...
    GROUP BY a.name_play

    Dipende dal dbms ma , come regola generale dovrebbe valere per tutti... Nel select quando usi un group by, puoi mettere solo campi con funzioni di aggregazione (Max,Min eccetera) oppure campi che compaiono nel Group by.

    Nel tuo caso hai dunque un errore..
  • Re: Join 3 tabelle

    Ciao, scusa per la mia ignoranza. Utilizzo SQLite
    Nella SELECT il campo
    a.name_play
    è inserito e quel campo viene raggruppato regolarmente...

    Potresti suggerirmi come la faresti tu?
  • Re: Join 3 tabelle

    Posso aiutarti se posti la struttura delle tabelle e cosa vuoi ricavare
  • Re: Join 3 tabelle

    Dunque, ti posto la query, che ha i nomi dei campi esatti.
    
    
      String tabella_conti = "SELECT a._id, a.nome_conto, a.saldo_iniziale, a.data_saldo, SUM(b.entrata), SUM(b.uscita), SUM(c.versamento), SUM(c.prelievo),  b.conto " +
    "FROM Conti a LEFT JOIN EntrateUscite b ON (a.nome_conto  =  b.conto) LEFT JOIN PrelieviVersamenti c ON (c.conto  =  a.nome_conto) GROUP BY a.nome_conto";
    	
    
    Le tabelle sono 3 (Conti, EntrateUscite, PrelieviVersamenti)

    Tabella Conti
    _ID - INTEGER PRIMARY KEY AUTOINCREMENT
    NOME_CONTO - TEXT
    DATA_SALDO_INIZIALE - TEXT
    SALDO_INIZIALE - TEXT

    Tabella EntrateUscite
    _ID - INTEGER PRIMARY KEY AUTOINCREMENT
    DATA - TEXT
    ENTRATA - REAL DEFAULT 0
    USCITA - REAL DEFAULT 0
    NOTE - TEXT
    CATEGORIA - TEXT
    CONTO - TEXT

    Tabella PrelieviVersamenti
    _ID - INTEGER PRIMARY KEY AUTOINCREMENT
    DATA - TEXT
    CONTO - TEXT
    PRELIEVO - REAL DEFAULT 0
    VERSAMENTO - - REAL DEFAULT 0


    Lo scopo della query è di sommare tutte le entrate, le uscite dalla tabella EntrateUscite, selezionare il saldo iniziale del conto dalla tabella Conti e sommare tutti i versamenti e prelievi dalla tabella PrelieviVersamenti. Il tutto deve essere raggruppato per il nome del conto. Grazie per l'aiuto
  • Re: Join 3 tabelle

    Dovrebbe essere più o meno cosi:
    
    SELECT SUM(eu.entrata),SUM(eu.uscita),MAX(c.saldo_iniziale),c.nomeconto,SUM(pv.prelievo),sum(pv.versamento)
    FROM entrateuscite eu JOIN conti c on(eu.conto=c.nome_conto) JOIN prelieviversamenti pv on(pv.conto=c.nome_conto)
    GROUP BY c.nomeconto;
    
    fammi sapere se va
  • Re: Join 3 tabelle

    Purtroppo non và. Per provare avevo memorizzato 3 diversi conti nella tabella Conti e ne visualizza solo 1. Non capisco.
  • Re: Join 3 tabelle

    Mi fai un esempio di tabelle popolate e di quello che vorresti ottenere?
  • Re: Join 3 tabelle

    Per esempio

    tabella conti
    conto saldo_iniziale data
    conto corrente 100 01/01/01
    altra banca 100 01/01/01

    tabella entrateuscite
    entrata data categoria conto
    100 01/01/01 a conto corrente

    tabella prelieviversamenti
    data conto prelievo versamento
    01/01/01 contocorrente 10 0
    01/01/01 altra banca 0 10

    di ogni conto esistente devo ottenere il saldo, cioè il saldo iniziale+entrata-uscita+versamento-prelievo.
  • Re: Join 3 tabelle

    E da questo esempio quindi vuoi ottenere in sostanza cosa?

    Fa un esempio anche dell'output
  • Re: Join 3 tabelle

    Mettiamo che ho 2 conti: conto_corrente, conto_corrente1

    tabella entrateuscite
    conto: conto_corrente
    entrate:10
    uscite:0

    tabella conti
    conto_corrente
    saldo iniziale: 10

    conto_corrente1
    saldo iniziale: 10



    tabella versamentiprelievi
    conto: conto_corrente
    versamento: 0
    prelievo: 10

    nel record successivo viene memorizzato il versamento nell'altro conto
    conto: conto_corrente1
    versamento:10
    prelievo: 0

    devo ottenere il saldo totale di ogni conto, quindi:
    somma entrate, somma uscite, somma prelievi, soma versamento + saldo iniziale

    nel esempio fatto l'output deve essere:
    conto_corrente: 10
    conto_corrente1: 20
  • Re: Join 3 tabelle

    Otterrai solo quello che riguarda conto_corrente.

    conto_corrente1 non lo otterrai perchè come puoi vedere, conto_corrente1 non è presente ne nellatabella entrateuscite e ne nella tabella versamentiprelievi quindi il Join non viene soddisfatto
  • Re: Join 3 tabelle

    Ok, per ottenere quello che ho scritto quale strada devo percorrere?
  • Re: Join 3 tabelle

    Tu ottieni il risultato corretto...

    Se vuoi ottenere anche conto_corrente1 devi metterlo anche nelle tabelle dove ti ho indicato che manca
  • Re: Join 3 tabelle

    Non capisco perchè avere due tabelle:
    - entrateuscite
    - versamentiprelievi

    quando dovrebbe essercene una sola.
    In realtà un versamento è un entrata, così come un prelievo è un uscita.

    Inoltre, avere due campi ENTRATA ed USCITA non è corretto, perchè entrambi fanno riferimento allo stesso 'oggetto'.
    Ad esempio, dovrebbe essercene uno solo IMPORTO ed andrebbe aggiunto un campo CAUSALE che verrà impostato a seconda del TIPO di movimento.

    I campi delle date non vanno impostati come TEXT ma come tipo DATE, altrimenti saranno rogne a non finire quando si vorranno fare interrogazioni (query) filtrate per data.
Devi accedere o registrarti per scrivere nel forum
16 risposte