SQLite torna strano risultato

di Anonimizzato12301 il
9 risposte
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

  • 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
  • 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?
  • 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"
  • 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è!
  • Riesci a postare un dump del database (se non contiene dati sensibili) così provo a testare qualche query?
  • 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.
  • Si, se il problema si presenta anche in quel caso allora va bene ugualmente
  • Si ho provato e l'errore è esattamente quello.

    Però come ti invio l'allegato?
  • 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