Autore Topic: Query somma  (Letto 1010 volte)

Offline deideidei

  • Utente junior
  • **
  • Post: 110
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S
  • Sistema operativo:
    Ubuntu 11.04
Query somma
« il: 27 Dicembre 2011, 15:17:55 CET »
0
Salve ragazzi, innanzi tutto buone feste !!
Poi mi servirebbe sapere una piccola cosa, ho un database con un campo importo ed un campo identificatore che può essere solo o 1 o 0, vorrei sapere come fare la query per sommare tutti i valori dell'importo delle varie riche della tabella ed anche sommare solo gli importi dell'identificatore 1 e solo per quelli dello 0.
Come faccio?

Offline E.Musso

  • Utente junior
  • **
  • Post: 82
  • Respect: +17
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy GT-S5660
  • Play Store ID:
    Emiliano Musso
  • Sistema operativo:
    Windows 7
Re:Query somma
« Risposta #1 il: 27 Dicembre 2011, 15:41:52 CET »
+1
Supponendo che la tua tabella si chiami "tua_tabella", e che i due campi abbiamo nome, rispettivamente, "importo" e "identificatore", io farei così:

Codice (Java): [Seleziona]
public static Double get_SUM_Importo(int identificatore){
       String[] parametri = new String[] { Integer.toString(identificatore) };
       Cursor cur = myDataBase.rawQuery("SELECT SUM(importo)  FROM tua_tabella WHERE identificatore=?", parametri);
       cur.moveToFirst();
       return cur.getDouble(0);                        
}

In questo modo, con la routine get_SUM_Importo(), specificando come parametro l'identificatore di cui ti serve la sommatoria, otterrai in uscita un valore double rappresentante la somma degli importi.

P.s.: ovviamente, la variabile myDataBase va sostituita con quella della tua connessione   ;-)
Bollettazione Interventi - Un taglio ai costi di tipografia per professionisti!
--
È stata trovata una soluzione al tuo problema?Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato

Offline deideidei

  • Utente junior
  • **
  • Post: 110
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S
  • Sistema operativo:
    Ubuntu 11.04
Re:Query somma
« Risposta #2 il: 27 Dicembre 2011, 17:08:03 CET »
0
ma questa routine la devo mettere nella classe del database ?

Offline E.Musso

  • Utente junior
  • **
  • Post: 82
  • Respect: +17
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy GT-S5660
  • Play Store ID:
    Emiliano Musso
  • Sistema operativo:
    Windows 7
Re:Query somma
« Risposta #3 il: 27 Dicembre 2011, 17:21:37 CET »
0
La variabile myDataBase deve essere di tipo SQLiteDatabase, quindi sì, devi inserire il metodo nella classe in cui puoi accedere al database (perlomeno se utilizzi dei metodi statici, come nel caso che ti ho suggerito).
Bollettazione Interventi - Un taglio ai costi di tipografia per professionisti!
--
È stata trovata una soluzione al tuo problema?Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato

Offline deideidei

  • Utente junior
  • **
  • Post: 110
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S
  • Sistema operativo:
    Ubuntu 11.04
Re:Query somma
« Risposta #4 il: 27 Dicembre 2011, 17:25:10 CET »
0
sono più chiaro, ho una classe database, che ho chiamato MyDatabase fatta così :
Codice (Java): [Seleziona]
package com.deodato.Risparmia;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase.CursorFactory;

public class MyDatabase {  

    SQLiteDatabase mmDb;
        DbHelper mDbHelper;
        Context mContext;
        private static final String DB_NAME="tutodb";//nome del db
        private static final int DB_VERSION=1; //numero di versione del nostro db
       
        public MyDatabase(Context ctx){
                mContext=ctx;
                mDbHelper=new DbHelper(ctx, DB_NAME, null, DB_VERSION);
                //quando istanziamo questa classe, istanziamo anche l'helper (vedi sotto)      
        }
       
        public void read(){  //il database su cui agiamo è leggibile/scrivibile
                mmDb=mDbHelper.getReadableDatabase();
               
        }
       
        public void open(){  //il database su cui agiamo è leggibile/scrivibile
                mmDb=mDbHelper.getWritableDatabase();
               
        }
       
        public void close(){ //chiudiamo il database su cui agiamo
                mmDb.close();
        }
       
       
        //i seguenti 2 metodi servono per la lettura/scrittura del db. aggiungete e modificate a discrezione
       
        public void insert(String nome ,double d, int identificatore, String data, String categoria, int id_cat, String note ){ //metodo per inserire i dati
                ContentValues cv=new ContentValues();
                //cv.put(ProductsMetaData.ID , id);
                cv.put(ProductsMetaData.IDENT, identificatore);
                cv.put(ProductsMetaData.NOME_KEY, nome);
                cv.put(ProductsMetaData.IMPORTO_KEY, d);
                cv.put(ProductsMetaData.DATA_KEY, data);
                cv.put(ProductsMetaData.CATEGORIA_KEY, categoria);
                cv.put(ProductsMetaData.ID_CAT_KEY, id_cat );
                cv.put(ProductsMetaData.NOTE_KEY, note);
                mmDb.insert(ProductsMetaData.GESTIONE_TABLE, null, cv);
        }
       
       
        public Cursor fetchProducts(){ //metodo per fare la query di tutti i dati
                return mmDb.query(ProductsMetaData.GESTIONE_TABLE, null, null, null, null, null, null);        
        }
       
       
        public Cursor soloEnt (){
                return mmDb.rawQuery("select * from " + ProductsMetaData.GESTIONE_TABLE + " where " + ProductsMetaData.IDENT + "=" + 0 , null);
        }
       
        public Cursor soloUsc (){
                return mmDb.rawQuery("select * from " + ProductsMetaData.GESTIONE_TABLE + " where " + ProductsMetaData.IDENT + "=" + 1 , null);
        }
       
        public Cursor byId(int Id)
    {
        return mmDb.rawQuery("select * from " + ProductsMetaData.GESTIONE_TABLE + " where " + ProductsMetaData.ID + "=" + Id  , null);
    }
       
       
        public void update_byID(int id, String nome ,double d, int identificatore, String data, String categoria, int id_cat, String note){
                ContentValues values = new ContentValues();
                values.put(ProductsMetaData.IDENT, identificatore);
                values.put(ProductsMetaData.NOME_KEY, nome);
                values.put(ProductsMetaData.IMPORTO_KEY, d);
                values.put(ProductsMetaData.DATA_KEY, data);
                values.put(ProductsMetaData.CATEGORIA_KEY, categoria);
                values.put(ProductsMetaData.ID_CAT_KEY, id_cat);
                values.put(ProductsMetaData.ENTRATA_NOTE_KEY, note);
                mmDb.update(ProductsMetaData.GESTIONE_TABLE, values, ProductsMetaData.ID+"="+id, null);
        }
       
        static class ProductsMetaData {
               
                 public static final String GESTIONE_TABLE = "products";
                 public static final String ID = "_id";
                 static final String IDENT = "ident";
                 static final String NOTE_KEY = "Note";
                 static final String ID_CAT_KEY = "id_cat";
                 static final String CATEGORIA_KEY = "Categoria";
                 static final String DATA_KEY = "Data";
                 static final String IMPORTO_KEY = "Importo";
                 static final String NOME_KEY = "Nome";
       
        }
       
        public boolean deleteNote(long rowId) {

        return mmDb.delete(ProductsMetaData.GESTIONE_TABLE, ProductsMetaData.ID + "=" + rowId, null) > 0;
    }

        public void deleteNoteall(String rowId) {

         mmDb.delete(ProductsMetaData.GESTIONE_TABLE, rowId, null) ;
    }
       
       
       
        private static final String GESTIONE_TABLE_CREATE = "CREATE TABLE IF NOT EXISTS "  //codice sql di creazione della tabella
               
                     
                      + ProductsMetaData.GESTIONE_TABLE + " ("
                      + ProductsMetaData.ID+ " integer primary key autoincrement, "
                      + ProductsMetaData.IDENT + " integer not null, "
                      + ProductsMetaData.NOME_KEY + " text not null, "
                      + ProductsMetaData.IMPORTO_KEY + " doble not null, "
                      + ProductsMetaData.DATA_KEY + " text not null, "
                      + ProductsMetaData.CATEGORIA_KEY + " text not null, "
                      + ProductsMetaData.ID_CAT_KEY + " integer not null, "
                      + ProductsMetaData.NOTE_KEY + " text not null);";
                 

        private class DbHelper extends SQLiteOpenHelper { //classe che ci aiuta nella creazione del db

                public DbHelper(Context context, String name, CursorFactory factory,int version) {
                        super(context, name, factory, version);
                }

                @Override
                public void onCreate(SQLiteDatabase _db) { //solo quando il db viene creato, creiamo la tabella
                        _db.execSQL(ENTRATA_TABLE_CREATE);
                       
                }
               

                @Override
                public void onUpgrade(SQLiteDatabase _db, int oldVersion, int newVersion) {
                        //qui mettiamo eventuali modifiche al db, se nella nostra nuova versione della app, il db cambia numero di versione
                        //Log.w("Example", "Upgrading database, this will drop tables and recreate.");
                // _db.execSQL("DROP TABLE IF EXISTS " + ENTRATA_TABLE_CREATE);
                // onCreate(_db);
                }
       
        }

}

e vorrei visualizzare in
Codice (Java): [Seleziona]
TextView saldo = (TextView)findViewById(R.id.Saldo);la somma di tutti gli importi con IDENT= 0 meno la somma di tutti gli importi degli IDENT = 1
Quale è il miglior modo per inserire quello che mi hai detto?

Offline deideidei

  • Utente junior
  • **
  • Post: 110
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S
  • Sistema operativo:
    Ubuntu 11.04
Re:Query somma
« Risposta #5 il: 27 Dicembre 2011, 17:26:00 CET »
0
ovviamente
Codice (Java): [Seleziona]
TextView saldo = (TextView)findViewById(R.id.Saldo);è presente nell'activity principale e non nella classe del DB

Offline E.Musso

  • Utente junior
  • **
  • Post: 82
  • Respect: +17
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy GT-S5660
  • Play Store ID:
    Emiliano Musso
  • Sistema operativo:
    Windows 7
Re:Query somma
« Risposta #6 il: 27 Dicembre 2011, 17:37:20 CET »
+1
Dunque, in base a quello che hai scritto ho rivisto il suggerimento: il codice da inserire nella classe MyDatabase è il seguente:

Codice (Java): [Seleziona]
public Double get_SUM_Importo(int identificatore){
       String[] parametri = new String[] { Integer.toString(identificatore) };
       Cursor cur = myDataBase.rawQuery("SELECT SUM(importo)  FROM " + ProductsMetaData.GESTIONE_TABLE + " WHERE identificatore=?", parametri);
       cur.moveToFirst();
       return cur.getDouble(0);                        
}

Il metodo è al pari, per esempio, della tua funzione soloUsc(), con la differenza che nel nostro caso non ritorneremo un Cursor, bensì direttamente un Double.
Nell'Activity dove hai il TextView saldo, dovrai impostarne il testo a quanto ritornato dal metodo: dopo averlo quindi correttamente inizializzato come hai scritto, l'istruzione da inserire sarà:

Codice (Java): [Seleziona]
saldo.setText(Double.toString(get_SUM_Importo(0)));
In questo modo, verrà interrogato il database per avere le somme relative alle righe con IDENT=0 (puoi cambiarlo se è il caso), ed il risultato sarà tradotto in String e scritto quindi nella tua TextView. Se vuoi usare due query separate per visualizzare la tua differenza, puoi fare:

Codice (Java): [Seleziona]
Double diff = get_SUM_Importo(0) - get_SUM_Importo(1);
saldo.setText(diff);

Oltre a questo, occhio alla scrittura delle query: nel tuo codice usi la concatenazione di stringhe, anzichè il passaggio di parametri. A livello di funzionalità non hai problemi, ma non è una best practice. Dalla raw query che ti ho scritto, puoi prendere spunto per rivedere la sintassi.
Bollettazione Interventi - Un taglio ai costi di tipografia per professionisti!
--
È stata trovata una soluzione al tuo problema?Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato

Offline deideidei

  • Utente junior
  • **
  • Post: 110
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S
  • Sistema operativo:
    Ubuntu 11.04
Re:Query somma
« Risposta #7 il: 27 Dicembre 2011, 18:04:00 CET »
0
nell'activity principale ho scritto in questa maniera
Codice (Java): [Seleziona]
 TextView saldo = (TextView)findViewById(R.id.Saldo);
       
        MyDatabase db=new MyDatabase(getApplicationContext());
        db.open();
       
        Double somma = db.get_SUM_Importo(0);
        saldo.setText(Double.toString(somma));
       
        db.close();
       

nella classe del DB ho cambiato in questa maniera xche altrimanti mi dava errore si sintassi
Codice (Java): [Seleziona]
public Double get_SUM_Importo(int identificatore){
               String[] parametri = new String[] { Integer.toString(identificatore) };
               Cursor cur = mmDb.rawQuery("select sum("+ProductsMetaData.IMPORTO_KEY+")  from " + ProductsMetaData.GESTIONE_TABLE + " where " + ProductsMetaData.IDENT + "=" + parametri , null);
                   cur.moveToFirst();
               return cur.getDouble(0);                        
        }
ho anche scritto cosi :
Codice (Java): [Seleziona]
public Double get_SUM_Importo(int identificatore){
       String[] parametri = new String[] { Integer.toString(identificatore) };
       Cursor cur = mmDb.rawQuery("SELECT SUM(importo)  FROM " + ProductsMetaData.GESTIONE_TABLE + " WHERE identificatore=?", parametri);
       cur.moveToFirst();
       return cur.getDouble(0);                        
}
compila tutto ma purtroppo l'applicazione mi restituisce un errore che da log cat ho questo :
12-27 18:03:04.134: E/AndroidRuntime(586): FATAL EXCEPTION: main
12-27 18:03:04.134: E/AndroidRuntime(586): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.deodato.Risparmia/com.deodato.Risparmia.MioActivity}: android.database.sqlite.SQLiteException: no such column: identificatore: , while compiling: SELECT SUM(importo)  FROM products WHERE identificatore=?
12-27 18:03:04.134: E/AndroidRuntime(586):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
12-27 18:03:04.134: E/AndroidRuntime(586):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
12-27 18:03:04.134: E/AndroidRuntime(586):    at android.app.ActivityThread.access$2300(ActivityThread.java:125)
12-27 18:03:04.134: E/AndroidRuntime(586):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
12-27 18:03:04.134: E/AndroidRuntime(586):    at android.os.Handler.dispatchMessage(Handler.java:99)
12-27 18:03:04.134: E/AndroidRuntime(586):    at android.os.Looper.loop(Looper.java:123)
12-27 18:03:04.134: E/AndroidRuntime(586):    at android.app.ActivityThread.main(ActivityThread.java:4627)
12-27 18:03:04.134: E/AndroidRuntime(586):    at java.lang.reflect.Method.invokeNative(Native Method)
12-27 18:03:04.134: E/AndroidRuntime(586):    at java.lang.reflect.Method.invoke(Method.java:521)
12-27 18:03:04.134: E/AndroidRuntime(586):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
12-27 18:03:04.134: E/AndroidRuntime(586):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
12-27 18:03:04.134: E/AndroidRuntime(586):    at dalvik.system.NativeStart.main(Native Method)
12-27 18:03:04.134: E/AndroidRuntime(586): Caused by: android.database.sqlite.SQLiteException: no such column: identificatore: , while compiling: SELECT SUM(importo)  FROM products WHERE identificatore=?
12-27 18:03:04.134: E/AndroidRuntime(586):    at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method)
12-27 18:03:04.134: E/AndroidRuntime(586):    at android.database.sqlite.SQLiteCompiledSql.compile(SQLiteCompiledSql.java:91)
12-27 18:03:04.134: E/AndroidRuntime(586):    at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:64)
12-27 18:03:04.134: E/AndroidRuntime(586):    at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:80)
12-27 18:03:04.134: E/AndroidRuntime(586):    at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:46)
12-27 18:03:04.134: E/AndroidRuntime(586):    at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:42)
12-27 18:03:04.134: E/AndroidRuntime(586):    at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1345)
12-27 18:03:04.134: E/AndroidRuntime(586):    at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1315)
12-27 18:03:04.134: E/AndroidRuntime(586):    at com.deodato.Risparmia.MyDatabase.get_SUM_Importo(MyDatabase.java:114)
12-27 18:03:04.134: E/AndroidRuntime(586):    at com.deodato.Risparmia.MioActivity.onCreate(MioActivity.java:26)
12-27 18:03:04.134: E/AndroidRuntime(586):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
12-27 18:03:04.134: E/AndroidRuntime(586):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
12-27 18:03:04.134: E/AndroidRuntime(586):    ... 11 more


cosa sbaglio ?

Offline E.Musso

  • Utente junior
  • **
  • Post: 82
  • Respect: +17
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy GT-S5660
  • Play Store ID:
    Emiliano Musso
  • Sistema operativo:
    Windows 7
Re:Query somma
« Risposta #8 il: 27 Dicembre 2011, 18:36:23 CET »
+1
L'errore nel log è relativo a quanto ho scritto nella query: se noti la clausola WHERE è impostata sul campo "identificatore", che probabilmente non esiste nel tuo db. Devi sostituire quel campo con il nome del tuo identificatore. Fammi sapere se così funziona  ;)

Codice (Java): [Seleziona]
android.database.sqlite.SQLiteException: [b]no such column: identificatore[/b]: , while compiling: SELECT SUM(importo)  FROM products WHERE identificatore=?
« Ultima modifica: 27 Dicembre 2011, 18:38:57 CET da E.Musso, Reason: Aggiunto riferimento all\'errore nel log »
Bollettazione Interventi - Un taglio ai costi di tipografia per professionisti!
--
È stata trovata una soluzione al tuo problema?Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato

Offline deideidei

  • Utente junior
  • **
  • Post: 110
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S
  • Sistema operativo:
    Ubuntu 11.04
Re:Query somma
« Risposta #9 il: 28 Dicembre 2011, 17:38:00 CET »
0
grazie mille  :D
ho risolto con questa query :
Codice (Java): [Seleziona]
rawQuery("SELECT SUM(" + ProductsMetaData.IMPORTO_KEY+") FROM " + ProductsMetaData.GESTIONE_TABLE + " WHERE "+ProductsMetaData.IDENT+"=?", parametri);