Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #21  
Antiguo 07-09-2012
Avatar de jooooseph
jooooseph jooooseph is offline
Miembro
 
Registrado: oct 2007
Posts: 50
Poder: 17
jooooseph Va por buen camino
BUENO.... Casi va por la respuesta, en el casi de mi ejemplo solo con 3 clientes funciona por los ingresos que he realizado, pero si hubiera un cuarto cliente "Betty" el cual no hubiera realizado ningun ingreso, cuando haga la consulta anual este cuarto cliente no me va a figurar en el reporte. y lo que necesito es que me figure.

con tu consulta seria asi

Cita:
Nombre ... | Enero | Febrero | Marzo | ...... hasta | Diciembre
-----------+--------+---------+-------+-------------------------
Cesar .... | 100.00 | 20.00 | 0.00 | ...... 0.00
Juan .... | 200.00 | 0.00 | 0.00 | ...... 0.00
Pedro .... | 100.00 | 0.00 | 0.00 | ...... 0.00
Y lo que yo necesito es

Nombre ... | Enero | Febrero | Marzo | ...... hasta | Diciembre
-----------+--------+---------+-------+-------------------------
Cesar .... | 100.00 | 20.00 | 0.00 | ...... 0.00
Betty..... | 0.00 | 0.00 | 0.00 | .......0.00
Juan .... | 200.00 | 0.00 | 0.00 | ...... 0.00
Pedro .... | 100.00 | 0.00 | 0.00 | ...... 0.00
[/quote]

Se podra hacer.
Responder Con Cita
  #22  
Antiguo 07-09-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por jooooseph Ver Mensaje
BUENO.... Casi va por la respuesta, en el casi de mi ejemplo solo con 3 clientes funciona por los ingresos que he realizado, pero si hubiera un cuarto cliente "Betty" el cual no hubiera realizado ningun ingreso, cuando haga la consulta anual este cuarto cliente no me va a figurar en el reporte. y lo que necesito es que me figure.
Y, ¿ya lo probaste? Porque yo sí, y sí me aparece Betty (bueno, en mi caso fue maria, pero da lo mismo )

// Saludos
Responder Con Cita
  #23  
Antiguo 07-09-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
¡Ah! Espera, tienes razón. Primero probé sin la condición del año y sí me aparecía maria, pero desaparece al poner el filtro. Pero prueba sustituyendo el filtro

Código SQL [-]
where extract(year from fecha) = 2012

por este otro:

Código SQL [-]
where coalesce(extract(year from fecha), 2012) = 2012

// Saludos
Responder Con Cita
  #24  
Antiguo 07-09-2012
Avatar de jooooseph
jooooseph jooooseph is offline
Miembro
 
Registrado: oct 2007
Posts: 50
Poder: 17
jooooseph Va por buen camino
Cita:
Empezado por roman Ver Mensaje
¡Ah! Espera, tienes razón. Primero probé sin la condición del año y sí me aparecía maria, pero desaparece al poner el filtro. Pero prueba sustituyendo el filtro

Código SQL [-]where extract(year from fecha) = 2012


por este otro:

Código SQL [-]where coalesce(extract(year from fecha), 2012) = 2012


// Saludos
Gracias por la solucion.... Claro que funciona y de maravilla... . Esa es la mejor consulta.
Responder Con Cita
  #25  
Antiguo 07-09-2012
Avatar de jooooseph
jooooseph jooooseph is offline
Miembro
 
Registrado: oct 2007
Posts: 50
Poder: 17
jooooseph Va por buen camino
Cita:
Empezado por roman Ver Mensaje
¡Ah! Espera, tienes razón. Primero probé sin la condición del año y sí me aparecía maria, pero desaparece al poner el filtro. Pero prueba sustituyendo el filtro

Código SQL [-]where extract(year from fecha) = 2012


por este otro:

Código SQL [-]where coalesce(extract(year from fecha), 2012) = 2012


// Saludos

solo una ultima ayudita.... como estaria funcionando el coalesce(extract(year from fecha), 2012) = 2012
el 2012 que esta dentro del parecntesis....
Responder Con Cita
  #26  
Antiguo 07-09-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
A ver, el uso del left join es el que permite incluir en la consulta registros que no tienen par en la tabla de ingresos. Pero al hacer el filtro volvían a desaparecer esos registros porque

Código SQL [-]
extract(year from date)

devuelve NULL precisamente para ellos y no satisfacía la comparación con 2012.

coalesce, por otra parte, es una función que devuelve el primer argumento que no sea NULL, Entonces

Código SQL [-]
coalesce(extract(year from date), 2012)

devolverá el segundo argumento parra esos registros, y, como queremos que sí los incluya, ponemos ese segundo argmuento igual al año que estamos examinando.

// Saludos
Responder Con Cita
  #27  
Antiguo 08-09-2012
Avatar de jooooseph
jooooseph jooooseph is offline
Miembro
 
Registrado: oct 2007
Posts: 50
Poder: 17
jooooseph Va por buen camino
Cita:
Empezado por roman Ver Mensaje
A ver, el uso del left join es el que permite incluir en la consulta registros que no tienen par en la tabla de ingresos. Pero al hacer el filtro volvían a desaparecer esos registros porque

Código SQL [-]extract(year from date)


devuelve NULL precisamente para ellos y no satisfacía la comparación con 2012.

coalesce, por otra parte, es una función que devuelve el primer argumento que no sea NULL, Entonces

Código SQL [-]coalesce(extract(year from date), 2012)


devolverá el segundo argumento parra esos registros, y, como queremos que sí los incluya, ponemos ese segundo argmuento igual al año que estamos examinando.

// Saludos
pero en este caso hay una pequeña dificultad, porque cuando quiera un reporte anterior tipo del 2011 o 2013. los unicos recultados que me pareceran son aquellos que nunca han ingresado nada. si hago una cosulta del 2011 con los datos que tengo ingresado solo me va a aparecer Betty con todos los meses en 0.00 y los demas a clientes ya no aparecen. es igual si pongo como referencia el año 2013.... A que se debe eso.....
Responder Con Cita
  #28  
Antiguo 09-09-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Si cambias de año, debes cambiar el parámetro en las dos partes donde aparece.

// Saludos
Responder Con Cita
  #29  
Antiguo 09-09-2012
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.410
Poder: 22
fjcg02 Va camino a la fama
Hola,
En el mismo hilo http://www.clubdelphi.com/foros/show...ht=select+case indico que no doy con las funciones de extraer año o mes !!
En aquel momento (como casi siempre) no andaba bien de tiempo y primé ofrecer una solución rápida al problema a hacerla lo más académica posible, es decir, utilizando las sentencias más precisas.



Pd:lo indico por las alusiones...
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #30  
Antiguo 10-09-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por jooooseph Ver Mensaje
pero en este caso hay una pequeña dificultad, porque cuando quiera un reporte anterior tipo del 2011 o 2013. los unicos recultados que me pareceran son aquellos que nunca han ingresado nada.
Ya vi el error. Tienes razón. Veamos otro intento antes de rendirnos a las subconsultas

Código SQL [-]
select
  clientes.nombre,
  sum(if(extract(year from fecha) = 2012 and extract(month from fecha) = 1, monto, 0)) as enero,
  sum(if(extract(year from fecha) = 2012 and extract(month from fecha) = 2, monto, 0)) as febrero,
  ...
  sum(if(extract(year from fecha) = 2012 and extract(month from fecha) = 12, monto, 0)) as diciembre
from clientes
left join ingresos on clientes.nombre = ingresos.nombre
group by nombre

Funciona en MySQL. Habría que ver en Firebird cómo se comporta el IF o el CASE cuando la condición valúa a NULL.

// Saludos
Responder Con Cita
  #31  
Antiguo 10-09-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por fjcg02 Ver Mensaje
Mira este hilo ver qué te parece.

Tira por lo que indi ca Román.

http://www.clubdelphi.com/foros/show...ighlight=pivot

saludos
Tiempo después...

Cita:
Empezado por fjcg02 Ver Mensaje
Hola,
En el mismo hilo http://www.clubdelphi.com/foros/show...ht=select+case indico que no doy con las funciones de extraer año o mes !!
¡Épale! Por poco nos metes gol. No es el mismo hilo

// Saludos
Responder Con Cita
  #32  
Antiguo 10-09-2012
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.410
Poder: 22
fjcg02 Va camino a la fama
Cita:
Empezado por roman Ver Mensaje
Tiempo después...



¡Épale! Por poco nos metes gol. No es el mismo hilo

// Saludos
Ya sabes, quiero meterlo por la escuadra y me sale por córner. A quién voy a meter un gol yo...

Saludos
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #33  
Antiguo 12-09-2012
Avatar de jooooseph
jooooseph jooooseph is offline
Miembro
 
Registrado: oct 2007
Posts: 50
Poder: 17
jooooseph Va por buen camino
Cita:
Empezado por roman Ver Mensaje
Ya vi el error. Tienes razón. Veamos otro intento antes de rendirnos a las subconsultas

Código SQL [-]select clientes.nombre, sum(if(extract(year from fecha) = 2012 and extract(month from fecha) = 1, monto, 0)) as enero, sum(if(extract(year from fecha) = 2012 and extract(month from fecha) = 2, monto, 0)) as febrero, ... sum(if(extract(year from fecha) = 2012 and extract(month from fecha) = 12, monto, 0)) as diciembre from clientes left join ingresos on clientes.nombre = ingresos.nombre group by nombre


Funciona en MySQL. Habría que ver en Firebird cómo se comporta el IF o el CASE cuando la condición valúa a NULL.

// Saludos
ROMAN gracias por la ayuda, era mas simple de lo que parecia.... Una ayuda mas y si no quisiera que me muestren montos sino que si hubo algun ingreso en el mes del cliente que me muestre "ok" o "0.00" si no hubo ingresos.
Responder Con Cita
  #34  
Antiguo 12-09-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.042
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Debes usar la función coalesce (en firebird, desconozco en otra BD), haz una búsqueda por los foros, se ha tratado en diversas ocasiones.
Responder Con Cita
  #35  
Antiguo 18-10-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.042
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
No repitas mensajes. Gracias.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Reporte en PDF lucasarts_18 Varios 4 31-03-2008 19:27:23
Resumen anual del Club Delphi 2006! Héctor Randolph La Taberna 4 19-12-2006 00:19:02
Reporte carols018 Varios 4 11-12-2006 09:02:00
Encuesta Anual Delphi xander Noticias 0 30-10-2006 20:09:03
Reporte erick_jesus Conexión con bases de datos 1 31-05-2006 17:22:50


La franja horaria es GMT +2. Ahora son las 09:42:09.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi