Ir al contenido



Foto

[Solucionado] SQLite: consulta agrupada por meses


  • Por favor identifícate para responder
2 respuestas en este tema

#1 jc

jc

    Member

  • Miembros
  • PipPip
  • 40 mensajes
  • LocationMojácar, Almería, España

Escrito 02 mayo 2014 - 11:07

Hola

Tengo una pequeña tabla SQLite que se creó de la siguiente manera:
CREATE TABLE importes (fecha DATETIME PRIMARY KEY NOT NULL, importe REAL NOT NULL, desc TEXT)

El campo fecha, aunque ahí se declaró como DATETIME, SQLite lo guarda como un texto con el formato YYY-MM-DD.

Ahora me ha surgido obtener todos los importes guardados agrupados por meses y años, es decir, obtener una salida así:

año      Ene  Feb  Mar  .....
2010    100  200  300  ....
2011    540  320    600  ....
...

La verdad no tengo ni idea de cómo hacerlo. Como máximo habrá una fila por día guardada, aunque no tiene por qué, es decir, habrá días que no aparezcan en la base de datos y tampoco sé de antemano los años de los que habrá datos.

La aplicación se hizo hace mucho tiempo, así que no me importaría incluso modificar la tabla, así de paso le hago una pequeña actualización a la aplicación.

Un saludo
  • 0

#2 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 02 mayo 2014 - 12:09

Saludos.

No he usado SQLite, por lo que te mostrare una idea de como se pudiera hacer:



delphi
  1. SELECT EXTRACT(YEAR FROM FECHA) ANIO,
  2. SUM(CASE EXTRACT(MONTH FROM FECHA) WHEN 1 THEN MONTO ELSE 0 END) ENE,
  3. SUM(CASE EXTRACT(MONTH FROM FECHA) WHEN 2 THEN MONTO ELSE 0 END) FEB,
  4. SUM(CASE EXTRACT(MONTH FROM FECHA) WHEN 3 THEN MONTO ELSE 0 END) MAR,
  5. SUM(CASE EXTRACT(MONTH FROM FECHA) WHEN 4 THEN MONTO ELSE 0 END) ABR,
  6. SUM(CASE EXTRACT(MONTH FROM FECHA) WHEN 5 THEN MONTO ELSE 0 END) MAY,
  7. SUM(CASE EXTRACT(MONTH FROM FECHA) WHEN 6 THEN MONTO ELSE 0 END) JUN,
  8. SUM(CASE EXTRACT(MONTH FROM FECHA) WHEN 7 THEN MONTO ELSE 0 END) JUL,
  9. SUM(CASE EXTRACT(MONTH FROM FECHA) WHEN 8 THEN MONTO ELSE 0 END) AGO,
  10. SUM(CASE EXTRACT(MONTH FROM FECHA) WHEN 9 THEN MONTO ELSE 0 END) SEP,
  11. SUM(CASE EXTRACT(MONTH FROM FECHA) WHEN 10 THEN MONTO ELSE 0 END) OCT,
  12. SUM(CASE EXTRACT(MONTH FROM FECHA) WHEN 11 THEN MONTO ELSE 0 END) NOV,
  13. SUM(CASE EXTRACT(MONTH FROM FECHA) WHEN 12 THEN MONTO ELSE 0 END) DIC
  14. FROM TABLA
  15. GROUP BY EXTRACT(YEAR FROM FECHA)
  16. ORDER BY EXTRACT(YEAR FROM FECHA)



Esto lo hice de mente, pueden haber errores y tampoco conozco las sentencias propias de SQLite para extraer los valores de año y mes de una fecha; esa parte te tocara investigar.
  • 0

#3 jc

jc

    Member

  • Miembros
  • PipPip
  • 40 mensajes
  • LocationMojácar, Almería, España

Escrito 03 mayo 2014 - 03:23

Bueno, así me ha quedado:



delphi
  1. SELECT strftime('%Y', fecha) as YEAR,
  2. sum(case strftime('%m', fecha) when '01' then importe else 0 end) Ene,
  3. sum(case strftime('%m', fecha) when '02' then importe else 0 end) Feb,
  4. sum(case strftime('%m', fecha) when '03' then importe else 0 end) Mar,
  5. sum(case strftime('%m', fecha) when '04' then importe else 0 end) Abr,
  6. sum(case strftime('%m', fecha) when '05' then importe else 0 end) May,
  7. sum(case strftime('%m', fecha) when '06' then importe else 0 end) Jun,
  8. sum(case strftime('%m', fecha) when '07' then importe else 0 end) Jul,
  9. sum(case strftime('%m', fecha) when '08' then importe else 0 end) Ago,
  10. sum(case strftime('%m', fecha) when '09' then importe else 0 end) Sep,
  11. sum(case strftime('%m', fecha) when '10' then importe else 0 end) Oct,
  12. sum(case strftime('%m', fecha) when '11' then importe else 0 end) Nov,
  13. sum(case strftime('%m', fecha) when '12' then importe else 0 end) Dic
  14. from importes
  15. group by YEAR
  16. order by YEAR



Lo he probado desde SQLite Manager y funciona.

De verdad que estaba perdido, pensaba que tendría que hacer vaias consultas para obtener todos los datos.

Muchísimas gracias. Un saludo
  • 0