Autore Topic: LEFT JOIN (SQLite)  (Letto 362 volte)

Offline JCC

  • Utente junior
  • **
  • Post: 99
  • Respect: +1
    • Mostra profilo
LEFT JOIN (SQLite)
« il: 28 Gennaio 2015, 16:40:45 CET »
0
Ciao, non capisco il comportamento di questa query, cioè: voglio sommare un campo di una tabella con diverse clausole e visualizzarli in una ListView. I campi vengono restituiti nel modo giusto ma la somma del valore più grande viene fatta 4 volte per se stessa.

Ad esempio la query mi restituisce:
fiat 4.000
bmw 300
audi 200
ferrari 500

invece dovrebbe restituire:
fiat 1.000
bmw 300
audi 200
ferrari 500


Codice (Java): [Seleziona]
private void Mese() {
    String anno = seleziona_anno.getText().toString();      
    SQLiteDatabase db = mHelper.getReadableDatabase();
    final List<Dettaglio> dettagli = new ArrayList<Dettaglio>();

String sql = "SELECT DISTINCT r.nome_categoria, r.colore_testo, c._id, c.categoria, SUM(c.spesa) FROM Auto c LEFT JOIN" +
    " Categorie r ON (c.categoria = r.nome_categoria) WHERE c.spesa>0 AND c.data LIKE '"+anno+"-"+mese_ric+"%' GROUP BY r.nome_categoria ORDER BY SUM(c.spesa) DESC";
Cursor c = db.rawQuery(sql, null);
while (c.moveToNext()){
        Dettaglio d = new Dettaglio();
        d.nome_cat = c.getString(0);
        d.colore = c.getInt(1);
        d.id = c.getInt(2);
        d.categorie = c.getString(3);
        d.spesa= c.getDouble(4);
       
             
        Log.d("SpesaAuto", "Value: " + Double.toString(d.spesa));
        dettagli.add(d);
    }
    c.close();


db.close();

« Ultima modifica: 28 Gennaio 2015, 17:28:58 CET da JCC »

Offline Brontomania

  • Nuovo arrivato
  • *
  • Post: 32
  • Dinosauro di lanetta
  • Respect: +5
    • Github
    • Google+
    • @Brontomania
    • Mostra profilo
  • Dispositivo Android:
    HTC One, Nexus 7, Nexus S
  • Sistema operativo:
    Windows 10
Re:LEFT JOIN (SQLite)
« Risposta #1 il: 01 Febbraio 2015, 19:13:28 CET »
0
Così a colpo d'occhio, guardando il sql:
1 ) se metti in join categorie e auto e fai la Group sulla categoria, se hai più auto (ad esempio 4 Fiat) il valore verrà quadruplicato dalla join.
2) se fai la Group by, la distinct non ti serve.

TTalk on HTC1


Offline JCC

  • Utente junior
  • **
  • Post: 99
  • Respect: +1
    • Mostra profilo
Re:LEFT JOIN (SQLite)
« Risposta #2 il: 01 Febbraio 2015, 20:35:54 CET »
0
suggerimenti?

Offline Brontomania

  • Nuovo arrivato
  • *
  • Post: 32
  • Dinosauro di lanetta
  • Respect: +5
    • Github
    • Google+
    • @Brontomania
    • Mostra profilo
  • Dispositivo Android:
    HTC One, Nexus 7, Nexus S
  • Sistema operativo:
    Windows 10
Re:LEFT JOIN (SQLite)
« Risposta #3 il: 01 Febbraio 2015, 22:03:17 CET »
0
Select r.nomecategoria, sum(c.spesa) from "come il tuo" where "come il tuo" Group by r.nomecategoria
Ma verifica quante auto hai con categoria Fiat perché in quel caso il join ti moltiplica le righe

TTalk on HTC1


Offline JCC

  • Utente junior
  • **
  • Post: 99
  • Respect: +1
    • Mostra profilo
Re:LEFT JOIN (SQLite)
« Risposta #4 il: 02 Febbraio 2015, 10:37:56 CET »
0
esatto mi moltiplica le righe, non posso modificare le tabelle perchè l'app è già online e avrei problemi con i backup.....

sono bloccato con questa cosa da giorni...come potrei risolvere?
Grazie

Offline Brontomania

  • Nuovo arrivato
  • *
  • Post: 32
  • Dinosauro di lanetta
  • Respect: +5
    • Github
    • Google+
    • @Brontomania
    • Mostra profilo
  • Dispositivo Android:
    HTC One, Nexus 7, Nexus S
  • Sistema operativo:
    Windows 10
Re:LEFT JOIN (SQLite)
« Risposta #5 il: 02 Febbraio 2015, 12:36:41 CET »
0
E se fai una sotto query (spero SQLite le gestisca, non ricordo)? tipo sostituisci la tabella AUTO con "SELECT distinct CATEGORIA, SPESA from AUTO" in modo da avere una lista distinta per CATEGORIA  e SPESA?

Oppure, togli la GROUP dalla tua query e lasci la distinct e sopra di questa costruisci una SELECT tipo:
SELECT CATEGORIA, avg(SPESA) from "( ... tua query .. )" GROUP BY CATEGORIA
oppure
SELECT CATEGORIA, max(SPESA) from "( ... tua query .. )" GROUP BY CATEGORIA


Perché usi il LEFT JOIN e non un INNER JOIN? Hai delle Categorie in AUTO non presenti in CATEGORIE?