SQLite torna strano risultato

di il
9 risposte

SQLite torna strano risultato

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


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();

9 Risposte

  • Re: SQLite torna strano risultato

    Ciao, secondo me questa è più una domanda per la categoria "database" piuttosto che "android".
    In ogni caso se ciò che vuoi ottenere è la spesa totale per ogni categoria, allora la query è sbagliata.
    Quello che farei è una cosa del tipo:
    
    SELECT c.nome_categoria, SUM(a.spesa) AS Spesa
    FROM Categoria c LEFT JOIN Auto a ON (c.nome_categoria = a.categoria)
    WHERE ...le tue condizioni...
    GROUP BY c.nome_categoria
    ORDER BY Spesa DESC
    
    Nota che il LEFT JOIN ti serve solo se vuoi che ti compaia la somma delle spese anche per quelle categorie per cui non esistono spese.
    Ad esempio se non ci sono spese per la categoria "Ferrari", con il left join ti comparirà anche la riga "Ferrari 0" (o qualcosa del genere), mentre con il join "normale" (cioè inner join) queste righe non sarebbero visualizzate
  • Re: SQLite torna strano risultato

    Aspetta forse hai letto velocemente, la query così com'è funziona e mi restituisce solo le categorie presenti nella tabella AUTO.
    L'unica cosa che non capisco è perchè il valore più alto viene sommato per se stesso 4 volte.

    In pratica la tua query è identica alla mia, tolta la clausola Distinct, provandola ottengo sempre lo stesso errore. hai altri suggerimenti?
  • Re: SQLite torna strano risultato

    Sinceramente mi sembra strano che proponga questo errore solo alla prima riga..hai provato ad esaminare il database manualmente, ad esempio col tool sqlite3 (che è già incluso nell'android sdk)? Magari esiste una tupla "vecchia" che ti sballa i risultati per la categoria "fiat"
  • Re: SQLite torna strano risultato

    Stò utilizzando "database browser for SQLite" e dentro le tabelle i dati sono ok.
    Come vedi nel mio post ho inserito un Log.d all'interno del Cursor e il risultato è sballato, quindi dò per scontato che l'errore è nella query.

    Non capisco perchè!
  • Re: SQLite torna strano risultato

    Riesci a postare un dump del database (se non contiene dati sensibili) così provo a testare qualche query?
  • Re: SQLite torna strano risultato

    Se per te và bene ti invio un database che ho utilizzato per una vecchia app, che provandolo con questa query restituisce gli stessi errori. Dimmi tu.
  • Re: SQLite torna strano risultato

    Si, se il problema si presenta anche in quel caso allora va bene ugualmente
  • Re: SQLite torna strano risultato

    Si ho provato e l'errore è esattamente quello.

    Però come ti invio l'allegato?
  • Re: SQLite torna strano risultato

    Puoi inviarmi un MP col dump SQL di quel database (con DB browser for SQLITE dovrebbe fartelo generare rapidamente: una cosa tipo File -> Export -> export DB to SQL)
Devi accedere o registrarti per scrivere nel forum
9 risposte