Autore Topic: Query SQL corretta?  (Letto 1298 volte)

iClaude

  • Visitatore
Query SQL corretta?
« il: 18 Aprile 2013, 21:28:01 CEST »
0
Salve a tutti.
Secondo voi questa query è corretta?

Ho una tabella con le spese sostenute (importo_valprin) e relative date di sostenimento (data).
Io vorrei ottenere una tabella con:
data
totale_spesa (cioè somma delle spese sostenute in quella data)


public static final String SPESE_SOST_DATA_TOTALE = "SELECT data, SUM(importo_valprin) AS totale_spesa FROM spese_sost WHERE data >= ? AND data <= ? GROUP BY data ORDER BY data DESC";

public Cursor getSpeseSostenutePerData(String dataInizio, String dataFine) {
      dataInizio = dataInizio + " 00:00:00";
      dataFine = dataFine + " 00:00:00";
      
      return mioSQLiteDatabase.rawQuery(SPESE_SOST_DATA_TOTALE, new String[] {dataInizio, dataFine});
   }

Offline blackgin

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1387
  • Respect: +164
    • Google+
    • blackgins
    • blackginsoft
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Mac OSX 10.8
Re:Query SQL corretta?
« Risposta #1 il: 18 Aprile 2013, 23:40:48 CEST »
0
La data l'hai memorizzata com AAAA/MM/GG o GG/MM/AAAA?
Visto che la data é memorizzata con una stringa, se sei nel primo caso l'ordinamento é corretto e allora i confronti funzionano. Nel secondo caso no.
Infatti risulterebbe 2020/01/01 > 2012/12/12, mentre 12/12/2012 > di 01/01/2020
Postate il LogCat LogCat LogCat LogCat LogCat

iClaude

  • Visitatore
Re:Query SQL corretta?
« Risposta #2 il: 19 Aprile 2013, 08:24:16 CEST »
0
Ciao,  grazie per la risposta.
La data la memorizzero' nel formato YYYY-MM-DD HH:MM:SS  che dovrebbe rientrare tra quelli consentiti.
Volevo solo una conferma della sintassi da usare non avendo molta dimestichezza con SQL...

Ma esiste qualche strumento che ti permette di creare un database SQLite di prova e testare le varie query?

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Query SQL corretta?
« Risposta #3 il: 19 Aprile 2013, 09:11:45 CEST »
0
io usavo questo:
SQLite Database Browser

comunque, se posso permettermi, le date salvale in formato long (timestamp), altrimenti rischi che ti vanno dentro cose non perfette
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Query SQL corretta?
« Risposta #4 il: 19 Aprile 2013, 10:38:39 CEST »
0
comunque, se posso permettermi, le date salvale in formato long (timestamp), altrimenti rischi che ti vanno dentro cose non perfette

Concordo.

Unico caso in cui conviene salvare le date in formato testo, è quando insieme a data e ora devi salvare anche la timezone a cui si riferisce. In tal caso il formato testo ti permette di includere anche tale informazione, cosa che è molto più complesso tracciare con formato long.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

iClaude

  • Visitatore
Re:Query SQL corretta?
« Risposta #5 il: 19 Aprile 2013, 11:11:23 CEST »
0
Ci avevo pensato,  però il livello max di dettaglio che mi serve è il giorno,  non l'ora.
Es. se devo estrarre tutte le spese di un dato giorno e ho memorizzato anche i secondi diventa un casino.
Ho visto che c'è la funzione julianday ma non ho trovato esempi concreti.
Poi ho visto che la guida ufficiale suggerisce di usare text x le date. ..

Offline blackgin

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1387
  • Respect: +164
    • Google+
    • blackgins
    • blackginsoft
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Mac OSX 10.8
Re:Query SQL corretta?
« Risposta #6 il: 19 Aprile 2013, 11:20:29 CEST »
0
Ci avevo pensato,  però il livello max di dettaglio che mi serve è il giorno,  non l'ora.
Es. se devo estrarre tutte le spese di un dato giorno e ho memorizzato anche i secondi diventa un casino.
Ho visto che c'è la funzione julianday ma non ho trovato esempi concreti.
Poi ho visto che la guida ufficiale suggerisce di usare text x le date. ..
Non capisco, perché diventa difficile se devi estrarre le spese in un giorno?
Prendi il timestamp del giorno in questione e del successivo estrai tutte le spese che sono >timestampGiorno && < timestampSuccessivo
Postate il LogCat LogCat LogCat LogCat LogCat

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Query SQL corretta?
« Risposta #7 il: 19 Aprile 2013, 11:30:28 CEST »
0
oltretutto se fai:
GregorianCalendar | Android Developers
Calendar | Android Developers()

Codice (Java): [Seleziona]
Calendar calendar = new GregorianCalendar(anno,mese,giorno);
long startTimestamp = calendar.getTimeInMillis();
long oneDayInMillis = 1000*60*60*24;
long endTimestamp = startTimestamp + oneDayInMillis;

hai già finito... il db è anche più efficiente coi valori numerici piuttosto che con le stringhe
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

iClaude

  • Visitatore
Re:Query SQL corretta?
« Risposta #8 il: 19 Aprile 2013, 16:29:26 CEST »
0
Ok, mi avete convinto: userò un campo INTEGER, anche se le query diventano un po' meno logiche e un po' più macchinose.
L'efficienza prima di tutto.

Post unito: 20 Aprile 2013, 20:24:14 CEST
Salve a tutti.
Secondo voi questa query è corretta?

Ho una tabella con le spese sostenute (importo_valprin) e relative date di sostenimento (data).
Io vorrei ottenere una tabella con:
data
totale_spesa (cioè somma delle spese sostenute in quella data)


public static final String SPESE_SOST_DATA_TOTALE = "SELECT data, SUM(importo_valprin) AS totale_spesa FROM spese_sost WHERE data >= ? AND data <= ? GROUP BY data ORDER BY data DESC";

public Cursor getSpeseSostenutePerData(String dataInizio, String dataFine) {
      dataInizio = dataInizio + " 00:00:00";
      dataFine = dataFine + " 00:00:00";
      
      return mioSQLiteDatabase.rawQuery(SPESE_SOST_DATA_TOTALE, new String[] {dataInizio, dataFine});
   }

Ho provato a testare la query con SQLite Database Browser ma purtroppo come temevo c'è qualche errore di sintassi...  o_O

Post unito: 20 Aprile 2013, 20:25:05 CEST
Ho provato a testare la query con SQLite Database Browser ma purtroppo come temevo c'è qualche errore di sintassi... 
« Ultima modifica: 20 Aprile 2013, 20:25:05 CEST da iClaude, Reason: Merged DoublePost »

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Query SQL corretta?
« Risposta #9 il: 22 Aprile 2013, 20:36:57 CEST »
0
A me il group BY non convince

Inviato dal mio Nexus 7 con Tapatalk 2
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

iClaude

  • Visitatore
Re:Query SQL corretta?
« Risposta #10 il: 22 Aprile 2013, 20:41:34 CEST »
0
A me il group BY non convince

Inviato dal mio Nexus 7 con Tapatalk 2

L'ho ritestato con SQLite Database Browser (ottima segnalazione) e ora funziona: probabilmente avevo sbagliato ad inserire i parametri delle date.

Ma se io faccio un group by c'è modo poi di usare lo stesso Cursor per vedere le singole spese in dettaglio sostenute in quella data, oppure devo fare un'altra query? Che sistema si usa in questi casi?

Offline jd4smart

  • Nuovo arrivato
  • *
  • Post: 9
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    samsung galaxy s
  • Sistema operativo:
    Win7
Re:Query SQL corretta?
« Risposta #11 il: 22 Aprile 2013, 22:36:57 CEST »
0
L'ho ritestato con SQLite Database Browser (ottima segnalazione) e ora funziona: probabilmente avevo sbagliato ad inserire i parametri delle date.

Ma se io faccio un group by c'è modo poi di usare lo stesso Cursor per vedere le singole spese in dettaglio sostenute in quella data, oppure devo fare un'altra query? Che sistema si usa in questi casi?

eh credo proprio di no.

Con il group by appunto vai ad accorpare un unico result un numero X di righe del db (a seconda appunto del match impostato).


Probabilmente non hai colto il suggerimento di Nicola che hai citato....


non ha molto senso che usi nella query sql il group by (soprattutto se il tuo scopo finale è vedere il dettaglio di ogni singola spesa)
SELECT data, SUM(importo_valprin) AS totale_spesa FROM spese_sost
WHERE data >= ? AND data <= ?     <- qui già vai a scremare il risultato in base ad una tua data di interesse
GROUP BY data ORDER BY data DESC <- togliendo il group by e lasciando solo ordinamento secondo tuo piacimento

Avrai un bel cursor che ti punta ad ogni riga che risponde al tuo match

...ovviamente se, come hai detto tu, a te interessa estrarre le spese con range massimo di un giorno.


Diverso è il caso in cui con la query vuoi estrapolare le query di più giorni....ma in quel caso consiglio sempre di togliere il "group by"
inoltrare la query con le date approprieate nella clausa where e poi fare i eventuali check sulle date direttamente nel codice quando stai scrollandoti tutto il tuo bel cursor per visualizzare i risultati (tanto cmq ordinati saranno ordinati)

iClaude

  • Visitatore
Re:Query SQL corretta?
« Risposta #12 il: 22 Aprile 2013, 23:02:30 CEST »
0
eh credo proprio di no.

Con il group by appunto vai ad accorpare un unico result un numero X di righe del db (a seconda appunto del match impostato).


Probabilmente non hai colto il suggerimento di Nicola che hai citato....


non ha molto senso che usi nella query sql il group by (soprattutto se il tuo scopo finale è vedere il dettaglio di ogni singola spesa)
SELECT data, SUM(importo_valprin) AS totale_spesa FROM spese_sost
WHERE data >= ? AND data <= ?     <- qui già vai a scremare il risultato in base ad una tua data di interesse
GROUP BY data ORDER BY data DESC <- togliendo il group by e lasciando solo ordinamento secondo tuo piacimento

Avrai un bel cursor che ti punta ad ogni riga che risponde al tuo match

...ovviamente se, come hai detto tu, a te interessa estrarre le spese con range massimo di un giorno.


Diverso è il caso in cui con la query vuoi estrapolare le query di più giorni....ma in quel caso consiglio sempre di togliere il "group by"
inoltrare la query con le date approprieate nella clausa where e poi fare i eventuali check sulle date direttamente nel codice quando stai scrollandoti tutto il tuo bel cursor per visualizzare i risultati (tanto cmq ordinati saranno ordinati)

Ok, specifico meglio il mio obiettivo.
Una parte della mia app avrà una ListView dove ogni elemento riporterà la data e il totale spese sostenute in quella data, ottenute con la query che ho postato. Cliccando su ogni elemento questo si espanderà mostrando il dettaglio delle spese sostenute in quel giorno.

La mia idea era quella di usare la query postata per ottenere il primo risultato, e usare una query distinta per ottenere il dettaglio.
Questo per migliorare le prestazioni ed evitare di caricare dati non necessari ritrovandomi la memoria occupata da un Cursor che a priori non so quanti dati potrà contenere (es. se l'intervallo viene impostato su più mesi o un anno).

Però, ripeto, è la prima volta che lo faccio per cui non so se questa è la soluzione migliore e soprattutto che effetti ha sulle prestazioni della mia app.

Offline jd4smart

  • Nuovo arrivato
  • *
  • Post: 9
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    samsung galaxy s
  • Sistema operativo:
    Win7
Re:Query SQL corretta?
« Risposta #13 il: 23 Aprile 2013, 08:06:45 CEST »
0
ok, avevo qualche sospetto che quello che volessi fare era qualcosa del genere!

il tuo dubbio è più che legittimo e sicuramente le considerazioni che hai fatto a priori sono corrette (poi bisogna anche valutare l'estensione che alla lunga potrebbe assumere il db)

Rispolverando un pochino sql e l'opzione group by
dire che non hai altra soluzione che utilizzare 2 cursor.....

Una volta che crei il primo cursor con SUM nella select e GROUP BY nella visualizzazione del risultato
avrai appunto un cursore che punta alla reply di quella query (dove non c'è traccia alcuna dei dettagli che hanno portato alla generazione delle singole rige)

Se per ogni riga (costituente appunto la somma di N entry reali nel db) vuoi avere dettagli a riguardo dovrai crearti un nuovo cursor
(che ne so "cursorDetails" e inizializzarlo con una nuova query che faccia un match specifico di quello da te rilevato)


a quel punto anche a livello di view nell'activity, credo che la soluzione più logica che ti permetta di avere il funzionamento voluto senza troppi sbattimenti, sia quello di utilizzare 2 view innestate nel xml.

Quella esterna sempre visibile popolata dalla query che hai postato già in precedenza
Una interna, che imposterai "INVISIBLE o GONE" e che andrai a popolare nella "OnItemClickListener" della listview esterna.

Offline blackgin

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1387
  • Respect: +164
    • Google+
    • blackgins
    • blackginsoft
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Mac OSX 10.8
Re:Query SQL corretta?
« Risposta #14 il: 23 Aprile 2013, 10:08:59 CEST »
0
a quel punto anche a livello di view nell'activity, credo che la soluzione più logica che ti permetta di avere il funzionamento voluto senza troppi sbattimenti, sia quello di utilizzare 2 view innestate nel xml.

Quella esterna sempre visibile popolata dalla query che hai postato già in precedenza
Una interna, che imposterai "INVISIBLE o GONE" e che andrai a popolare nella "OnItemClickListener" della listview esterna.
Basta usare una ExpandableListView, che gestisce già questa situazione..
Postate il LogCat LogCat LogCat LogCat LogCat