Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » PostgreSQL »

Consulta de comparacion en 3 años

Estas en el tema de Consulta de comparacion en 3 años en el foro de PostgreSQL en Foros del Web. Buenas gente, necesito ayuda con una super consulta (a mi parecer) para hacer comparaciones. Les paso a comentar, se trata de ver las comparaciones de ...
  #1 (permalink)  
Antiguo 04/04/2008, 16:47
Avatar de [NiRVaNa]  
Fecha de Ingreso: abril-2004
Ubicación: Someplace In The Middle Of Nowhere!
Mensajes: 325
Antigüedad: 20 años, 8 meses
Puntos: 6
Pregunta Consulta de comparacion en 3 años

Buenas gente, necesito ayuda con una super consulta (a mi parecer) para hacer comparaciones.

Les paso a comentar, se trata de ver las comparaciones de alumnos inscriptos a lo largo de 3 años acorde a la fecha.

El resultado de mi consulta deberia ser algo asi

Fecha | Año1 | Cant | Año2 | Cant | Año3 | Cant
------------------------------------------------------------
01/03 |2006 | 20 | 2007 |10 |2008 | 15
04/05 |2006 | 10 | 2007 | 15 | 2008 | 5

Actualmente tengo una consulta que me devuelve los resultados de 3 años, pero con los campos fecha y cantidad (ver modelo abajo). Pero mi problema es que nose como hacer en una sola consulta para que me devuelva el resultado de los 3 años, pero cada año en una columna aparte, como se muestra arriba

Esta consulta da un resultado asi:

Fecha | Cantidad
-----------------------------
xx/xx/2006 | 50
xx/xx/2006 | 20
xx/xx/2007 | 30
xx/xx/2008 | 15

Aqui esta mi consulta actual
Código:
select DATE(fec) as fecha, count(*) as cantInscriptos
from 
(
select si.fecins as fec
from inscasig i

join solicitudinsc si
on (i.idsolicitudinsc = si.idsolicitudinsc)

join  cursoasigdet cs
on (i.idcursoasigdet= cs.idcursoasigdet)

join alumno al
on (i.codalumno = al.codalumno and
    si.codalumno = al.codalumno)

join alumnomatricula almat
on (al.codalumno = almat.codalumno)

join cursoasigcab csc
on ( cs.codfacul = csc.codfacul  and
     cs.codcarsec= csc.codcarsec and
     cs.codcurso = csc.codcurso  and
     cs.codasig  = csc.codasig  ) 
join curso cu
on ( csc.codfacul = cu.codfacul  and
     csc.codcarsec= cu.codcarsec and
     csc.codcurso = cu.codcurso  
      )
join carreraseccab crs
on ( cu.codfacul = crs.codfacul  and
     cu.codcarsec= crs.codcarsec )

join carrera car
on ( crs.codfacul  = car.codfacul  and
     crs.codcarrera= car.codcarrera )

where date(si.fecins) >= '01/01/2007' and date(si.fecins) <= '01/01/2008'

group by fec
) as lista


group by fecha
order by fecha
  #2 (permalink)  
Antiguo 04/04/2008, 19:00
Avatar de Sergestux  
Fecha de Ingreso: agosto-2007
Ubicación: Tapachula
Mensajes: 1.218
Antigüedad: 17 años, 4 meses
Puntos: 20
Re: Consulta de comparacion en 3 años

Por que no detallas mas para que deseas usar esa consulta, si es para un sitio web, aplicación de escritorio... por que lo mas seguro es que es mucho mas facil si te haces una consulta sencilla y donde recoges los valores con el lenguaje que estés utilizando distribuirlo en columnas, de lo contrario tu consulta va a quedar bien pesada y sobre todo si es por web que estas consultando no te conviene hacerlo asi
  #3 (permalink)  
Antiguo 07/04/2008, 01:34
 
Fecha de Ingreso: febrero-2007
Mensajes: 1.292
Antigüedad: 17 años, 10 meses
Puntos: 13
Re: Consulta de comparacion en 3 años

Buenas, vamos por pasos:

Primero esto no es una superconsulta
Segundo esa select no te puede dar el resultado que muestras 2006 con ese date(si.fecins) >= '01/01/2007' and date(si.fecins) <= '01/01/2008'.
Tercero la consulta anidada te la puedes ahorrar

Y por ultimo, como bien te dice Sergestux, para que lo quieres, porque se puede hacer, pero si es para web te es mucho más facil y eficiente hacerlo en tu lenguaje de programación.

A la espera
  #4 (permalink)  
Antiguo 07/04/2008, 07:36
Avatar de [NiRVaNa]  
Fecha de Ingreso: abril-2004
Ubicación: Someplace In The Middle Of Nowhere!
Mensajes: 325
Antigüedad: 20 años, 8 meses
Puntos: 6
Re: Consulta de comparacion en 3 años

Bueno, la consulta que puse alli es un ejemplo. Lo mas bien se podrian cambiar el rango de fechas, y me daria el resultado expuesto, pero no el que necesito.

La consulta la necesito para generar un reporte, como dije antes, de comparacion. Estoy usando iReports usando una base de datos Postgres, y es una aplicacion web, via intranet, asi que no hay problema por los tiempos. El reporte se genera en formato pdf, dependiendo de la consulta que ingreso y como acomodo los campos que extraigo.

A lo mejor la consulta que puse como ejemplo es muy compleja. Basicamente necesito hacer lo que puse arriba, pero tres veces. Es decir, la consulta de arriba puede darme los datos de uno o mas años, dependiendo del rango de fechas.

YO habia pensado "triplicar" la consulta de arriba, pero necesito que quede dentro de una sola consulta.

Pense en esta forma, nose si se podra hacer.

Código:
SELECT fecha, anho1, cant1, anho2, cant2, anho3, cant3
FROM (
  SELECT xx.xx as anho1, count(*) as cant1 FROM tabla,
  SELECT xx.xx as anho2, count(*) as cant2 FROM tabla,
  SELECT xx.xx as anho3, count(*) as cant3 FROM tabla
)
WHERE condicion/es
Alguna idea...?
  #5 (permalink)  
Antiguo 07/04/2008, 07:47
 
Fecha de Ingreso: febrero-2007
Mensajes: 1.292
Antigüedad: 17 años, 10 meses
Puntos: 13
Re: Consulta de comparacion en 3 años

Vale,

prueba algo asi:

select fecha_sin_año,
CASE WHEN año_fecha = primer_año THEN 1 ELSE null END as contador_año1,
CASE WHEN año_fecha = segundo_año THEN 1 ELSE null END as contador_año2,
CASE WHEN año_fecha = tercer_año THEN 1 ELSE null END as contador_año3
from tablas
....

Salu2
  #6 (permalink)  
Antiguo 07/04/2008, 07:52
Avatar de [NiRVaNa]  
Fecha de Ingreso: abril-2004
Ubicación: Someplace In The Middle Of Nowhere!
Mensajes: 325
Antigüedad: 20 años, 8 meses
Puntos: 6
Re: Consulta de comparacion en 3 años

Para cada año puedo tener x cantidad de fechas si es lo que preguntas, si es por las xx.xx era para hacer lo mas general. De vuelta:

Código:
SELECT fecha, anho1, cant1, anho2, cant2, anho3, cant3
FROM (
  SELECT date(si.fecins) as anho1, count(*) as cant1 FROM tabla,
  SELECT date(si.fecins) as anho2, count(*) as cant2 FROM tabla,
  SELECT date(si.fecins) as anho3, count(*) as cant3 FROM tabla
)
WHERE condicion/es
Vale aclarar que segun lo que pense, cada select dentro del select mayor, tendria una condicion haciendo alusion al año que necesito.
  #7 (permalink)  
Antiguo 07/04/2008, 08:10
Avatar de [NiRVaNa]  
Fecha de Ingreso: abril-2004
Ubicación: Someplace In The Middle Of Nowhere!
Mensajes: 325
Antigüedad: 20 años, 8 meses
Puntos: 6
Re: Consulta de comparacion en 3 años

No, no es lo que estoy buscando. Voy a probar hacer selects separados y luego usar la instruccion union para ver si sale.

Voy a poner luego por si alguien tiene el mismo problema que yo, tambien espero algun otro punto de vista...
  #8 (permalink)  
Antiguo 07/04/2008, 08:22
 
Fecha de Ingreso: febrero-2007
Mensajes: 1.292
Antigüedad: 17 años, 10 meses
Puntos: 13
Re: Consulta de comparacion en 3 años

Cita:
Iniciado por [NiRVaNa] Ver Mensaje
No, no es lo que estoy buscando. Voy a probar hacer selects separados y luego usar la instruccion union para ver si sale.

Voy a poner luego por si alguien tiene el mismo problema que yo, tambien espero algun otro punto de vista...
Porque no es lo que estan buscando? Eso te sacaria lo que quieres, otra cosa es que no lo entiendas o no te guste, pero he hecho informes con ireport y jasperreport y esto funciona bien.

Sino, otro punto de vista, haces las 3 select y unirlas mediante UNION.

Salu2
  #9 (permalink)  
Antiguo 07/04/2008, 08:40
 
Fecha de Ingreso: febrero-2007
Mensajes: 1.292
Antigüedad: 17 años, 10 meses
Puntos: 13
Re: Consulta de comparacion en 3 años

Por ejemplo, con estos datos,

1/01/2005
1/07/2005
1/07/2006
1/01/2006
1/05/2007

año_sin_fecha --> año1 año2 año3
01/01 --> 1 1 0
01/05 --> 0 0 1
01/07 --> 1 1 0

este no es el resultado que buscas?
  #10 (permalink)  
Antiguo 07/04/2008, 08:44
Avatar de [NiRVaNa]  
Fecha de Ingreso: abril-2004
Ubicación: Someplace In The Middle Of Nowhere!
Mensajes: 325
Antigüedad: 20 años, 8 meses
Puntos: 6
Re: Consulta de comparacion en 3 años

No es lo que buscaba, a lo mejor no lo entendi como decia, pero no es porque no me guste, sino porque tambien tengo que tomar en cuenta que puede haber fechas en un anho en la que se inscribieron alumnos, pero en esa misma fecha al anho siguiente no lo hicieron, y segun las condiciones que presentaste, no se estaria contemplado. A no ser que se agregue otra condicion, pero a mi parecer es complicar mas el panorama.

Como dije, voy a tratar con el union. Y disculpa si es que te ofendi con mi comentario. No fue mi intencion.
  #11 (permalink)  
Antiguo 07/04/2008, 10:24
 
Fecha de Ingreso: febrero-2007
Mensajes: 1.292
Antigüedad: 17 años, 10 meses
Puntos: 13
Re: Consulta de comparacion en 3 años

Cita:
Iniciado por [NiRVaNa] Ver Mensaje
No es lo que buscaba, a lo mejor no lo entendi como decia, pero no es porque no me guste, sino porque tambien tengo que tomar en cuenta que puede haber fechas en un anho en la que se inscribieron alumnos, pero en esa misma fecha al anho siguiente no lo hicieron, y segun las condiciones que presentaste, no se estaria contemplado. A no ser que se agregue otra condicion, pero a mi parecer es complicar mas el panorama.

Como dije, voy a tratar con el union. Y disculpa si es que te ofendi con mi comentario. No fue mi intencion.
Tranquilo, no me ofendiste.
Es que creo que no lo estas pillando, viste el ejemplo que te puse?

Cita:
Por ejemplo, con estos datos,

1/01/2005
1/07/2005
1/07/2006
1/01/2006
1/05/2007

año_sin_fecha --> año1 año2 año3
01/01 --> 1 1 0
01/05 --> 0 0 1
01/07 --> 1 1 0

este no es el resultado que buscas?
En el año 2005 hay una fecha que no esta en los otros años y en el 2006 y 2007 las fechas no estan en el 2005, no es correcto el resultado? no es lo que buscas?

A la espera
  #12 (permalink)  
Antiguo 07/04/2008, 17:02
Avatar de [NiRVaNa]  
Fecha de Ingreso: abril-2004
Ubicación: Someplace In The Middle Of Nowhere!
Mensajes: 325
Antigüedad: 20 años, 8 meses
Puntos: 6
Exclamación Re: Consulta de comparacion en 3 años

Actualmente mi consulta quedo asi:

Código:
select codsede, DATE(fec) as fecha, anho, count(cant1) as cant1, count(cant2) as cant2, count(cant3) as cant3
from 
(
select  cs.codsede, cs.anho, si.fecins as fec, cs.semestre,
case when date_part('year', si.fecins) = 2006 then 1 else null end as cant1,
case when date_part('year', si.fecins) = 2007 then 1 else null end as cant2,
case when date_part('year', si.fecins) = 2008 then 1 else null end as cant3

from inscasig i

/*
Multiples joins
*/

where cs.codsede = 'SE'
and   cs.semestre = 1
and   si.aprobado = 'S'
and   si.codtipoinsc != 'REC'
and date(si.fecins) >= '01/01/2006' and date(si.fecins) <= '01/01/2008'

group by cs.codsede, fec, cs.anho, cs.semestre
order by fec
) as lista

group by codsede, fecha, anho
order by fecha
Ahora bien, tengo una pregunta tonta, como hago para hacer el select de la fecha sin el año? porque no se como hacerlo, y asi como esta, no hace lo que necesito todavia...

Devuelve este tipo de resultados

Fecha | cant1(año1) | cant2(año2)
01/01/2007 | 25 | 0
01/02/2007 | 10 | 0
01/02/2008 | 0 | 20

y en teoria los ultimos 2 resultados tendrian que estar en una misma fila...
  #13 (permalink)  
Antiguo 09/04/2008, 01:50
 
Fecha de Ingreso: febrero-2007
Mensajes: 1.292
Antigüedad: 17 años, 10 meses
Puntos: 13
Re: Consulta de comparacion en 3 años

Buenas,

por ejemplo puede hacerlo asi:
Código:
EXTRACT(day from fecha) || '/' || EXTRACT(month from fecha) as fecha_sin_año
Por que anidas las consultas, puedes hacerlo sin anidarlas:
Código:
select codsede, DATE(fec) as fecha, anho, 
                 count(case when date_part('year', si.fecins) = 2006 then 1 else null end) as cant1,
[...]
Un saludo
  #14 (permalink)  
Antiguo 09/04/2008, 18:51
Avatar de Sergestux  
Fecha de Ingreso: agosto-2007
Ubicación: Tapachula
Mensajes: 1.218
Antigüedad: 17 años, 4 meses
Puntos: 20
Re: Consulta de comparacion en 3 años

Si es eso lo que deseas tambien puedes hacerlo asi

Código:
SELECT to_char(fecha, 'DD/MM')
  #15 (permalink)  
Antiguo 10/04/2008, 01:25
 
Fecha de Ingreso: febrero-2007
Mensajes: 1.292
Antigüedad: 17 años, 10 meses
Puntos: 13
Re: Consulta de comparacion en 3 años

Cita:
Iniciado por Sergestux Ver Mensaje
Si es eso lo que deseas tambien puedes hacerlo asi

Código:
SELECT to_char(fecha, 'DD/MM')
Sabia que tenia que existir una forma más elegante de hacerlo

Me lo apunto.

Un saludo
  #16 (permalink)  
Antiguo 10/04/2008, 13:08
Avatar de [NiRVaNa]  
Fecha de Ingreso: abril-2004
Ubicación: Someplace In The Middle Of Nowhere!
Mensajes: 325
Antigüedad: 20 años, 8 meses
Puntos: 6
Re: Consulta de comparacion en 3 años

Bueno gente... gracias a su ayuda esta a punto de salir...

De hecho la información que necesito esta, ahora lo que necesito es formatearla para mi reporte, porque como ya dije, necesito que por cada fila aparesca la fecha, y la cantidad por cada año. Y la consulta me tira de la siguiente manera:


Link a la imagen (a veces no se muestra)

Esos 2 resultados que estan resaltados necesito que esten en una sola fila. Probe haciendo un distinct(to_char(fecha, 'DD/MM')) pero no es valido. Quiero hacer para que cada vez que una fecha se repita se acople el contador a la ya existente, se entiende?

Gracias...

Última edición por [NiRVaNa]; 10/04/2008 a las 13:11 Razón: A veces no se muestra la imagen
  #17 (permalink)  
Antiguo 12/04/2008, 04:43
 
Fecha de Ingreso: febrero-2007
Mensajes: 1.292
Antigüedad: 17 años, 10 meses
Puntos: 13
Re: Consulta de comparacion en 3 años

si pones la consulta que utlizas podremos ver donde está el fallo.

Salu2
  #18 (permalink)  
Antiguo 16/04/2008, 14:04
Avatar de [NiRVaNa]  
Fecha de Ingreso: abril-2004
Ubicación: Someplace In The Middle Of Nowhere!
Mensajes: 325
Antigüedad: 20 años, 8 meses
Puntos: 6
Re: Consulta de comparacion en 3 años

Hola gente. Al fin pude lograr mi cometido. La consulta que estaba utilizando al momento de escribir el post anterior es la misma que esta un poco mas arriba, y el error por el cual no me "juntaba" las fechas, era simplemente porque uno de los campos que estaba trayendo para los resultados era el de anho, y por cada fecha que se repetia, se "separaba" debido al campo de anho. Una vez que quite eso funciono perfectamente...

Con respecto a lo de las subconsultas, es porque al utilizar la consulta de adentro sola no retornaba el resultado esperado, por eso opte por seguir asi, ya que es como un patron que sigo en todos mis reportes, pero no quita calidad a mi trabajo por lo tanto, no me preocupa.

Eso es todo, muchas gracias seyko y Sergestux por la ayuda....!!! :D
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:45.