Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Reporte Anual (https://www.clubdelphi.com/foros/showthread.php?t=80158)

jooooseph 07-09-2012 21:58:31

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.

roman 07-09-2012 22:03:07

Cita:

Empezado por jooooseph (Mensaje 442354)
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 :D)

// Saludos

roman 07-09-2012 22:11:32

¡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

jooooseph 07-09-2012 22:33:08

Cita:

Empezado por roman (Mensaje 442359)
¡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.

jooooseph 07-09-2012 22:59:59

Cita:

Empezado por roman (Mensaje 442359)
¡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....:cool:

roman 07-09-2012 23:40:18

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

jooooseph 08-09-2012 19:45:27

Cita:

Empezado por roman (Mensaje 442376)
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.....^\||/

roman 09-09-2012 16:41:27

Si cambias de año, debes cambiar el parámetro en las dos partes donde aparece.

// Saludos

fjcg02 09-09-2012 22:53:49

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.

:D

Pd:lo indico por las alusiones...;)

roman 10-09-2012 18:56:24

Cita:

Empezado por jooooseph (Mensaje 442463)
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

roman 10-09-2012 20:13:47

Cita:

Empezado por fjcg02 (Mensaje 442252)
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 (Mensaje 442526)
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 :p

// Saludos

fjcg02 10-09-2012 22:42:45

Cita:

Empezado por roman (Mensaje 442659)
Tiempo después...



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

// Saludos

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

Saludos

jooooseph 12-09-2012 17:52:57

Cita:

Empezado por roman (Mensaje 442639)
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.^\||/

Casimiro Notevi 12-09-2012 18:06:05

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.

Casimiro Notevi 18-10-2012 22:32:28

No repitas mensajes. Gracias.


La franja horaria es GMT +2. Ahora son las 14:30:35.

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