Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   consulta para resumen mensual (https://www.clubdelphi.com/foros/showthread.php?t=72899)

fjcg02 23-03-2011 09:44:24

Prueba con esto

Código SQL [-]
select 
       sum(case day(fecha) when 1 then Kgs else 0 end) '1',
       sum(case day(fecha) when 2 then Kgs else 0 end) '2',  
       sum(case day(fecha) when 3 then Kgs else 0 end) '3',
       sum(case day(fecha) when 4 then Kgs else 0 end) '4',
       sum(case day(fecha) when 5 then Kgs else 0 end) '5',
       sum(case day(fecha) when 6 then Kgs else 0 end) '6',
       sum(case day(fecha) when 7 then Kgs else 0 end) '7',
       sum(case day(fecha) when 8 then Kgs else 0 end) '8',
       sum(case day(fecha) when 9 then Kgs else 0 end) '9',
       sum(case day(fecha) when 10 then Kgs else 0 end) '10',
       sum(case day(fecha) when 11 then Kgs else 0 end) '11',
       sum(case day(fecha) when 12 then Kgs else 0 end) '12',
       sum(case day(fecha) when 13 then Kgs else 0 end) '13',
       sum(case day(fecha) when 14 then Kgs else 0 end) '14',
       sum(case day(fecha) when 15 then Kgs else 0 end) '15',
       sum(case day(fecha) when 16 then Kgs else 0 end) '16',
       sum(case day(fecha) when 17 then Kgs else 0 end) '17',
       sum(case day(fecha) when 18 then Kgs else 0 end) '18',
       sum(case day(fecha) when 19 then Kgs else 0 end) '19',
       sum(case day(fecha) when 20 then Kgs else 0 end) '20',
       sum(case day(fecha) when 21 then Kgs else 0 end) '21',
       sum(case day(fecha) when 22 then Kgs else 0 end) '22',
       sum(case day(fecha) when 23 then Kgs else 0 end) '23',
       sum(case day(fecha) when 24 then Kgs else 0 end) '24',
       sum(case day(fecha) when 25 then Kgs else 0 end) '25',
       sum(case day(fecha) when 26 then Kgs else 0 end) '26',
       sum(case day(fecha) when 27 then Kgs else 0 end) '27',
       sum(case day(fecha) when 28 then Kgs else 0 end) '28',
       sum(case day(fecha) when 29 then Kgs else 0 end) '29',
       sum(case day(fecha) when 30 then Kgs else 0 end) '30',
       sum(case day(fecha) when 31 then Kgs else 0 end) '31',
       sum(Kgs) Total
 from Recepcion me 
RIGHT JOIN dIAS ON me.fecha=dias.fecha

 where fecha between '20110101' and '20110131'

De todas maneras, antes de hacer nada, comprueba tal como te han dicho los compañeros que las joins te dan la información que quieres.
Es decir, un left join o un right join dependiendo de dónde pongas la tabla de días, deberá darte al menos un registro de cada día. Si en la tabla de datos no hay registros, el valor que sumas deberá ser nulo.

haz esto:
Código SQL [-]
select D.Fecha, R.kgs 
from Dias D 
LEFT JOIN REcepcion R ON D.fecha=R.fecha
debe ofrecerte al menos un registro por día, tal como comentaba. A partir de aquí pones el group by , y luego formateas en filas o columnas tal y como ta han comentado.

Nos cuentas.

Saludos

PacoPepe 23-03-2011 13:59:59

Creo que no me he explicado bien sobre los JOIN.
Yo sé como funcionan los diferentes tipos de JOIN, llevo mucho tiempo usándolos, pero en esta ocasión y por algún motivo, no funcionan adecuadamente.

Pongo un ejemplo
Tengo la siguiente tabla de Recepción

Código:

Dia            Kgs
01/01/2010.....10
01/01/2010.....20
04/01/2010.....50

Quiero hacer un informe resumen de las entradas diarias, y en este ejemplo debería ser


Código:

Dia              Kgs
1                  30
2                    0
3                    0
4                  50

Me he creado una tabla auxiliar DIAS, con los dias del 1 al 31

Y hago la siguiente consulta

Código SQL [-]select d.dia, rm.suma from dias d left join (select extract(day from fecha) as dia, sum(kgs) as suma from Recepcion where ano = 2010 group by dia ) as rm on d.iddia = rm.dia


Y el resultado es


Código:

Dia              Kgs
1                  30
4                  50

En lugar de


Código:

Dia              Kgs
1                  30
2                    0
3                    0
4                  50

Por esto digo que el LEFT JOIN no está funcionando bien, o hay algo que se me escapa y que os agradecería me ayudarais a resolver

Un saludo

PacoPepe 23-03-2011 14:04:16

En las respuestas que me habeis dado, la solución de gluglu es mejor que la mia.

Yo creo una tabla auxiliar DIAS con 31 dias, pero de esta forma supongo que todos los meses tienen 31 días.
Sin embargo, gluglu con su
PROCEDURE AUTO_INC_DATE

va avanzado dia a dia real, de esta forma tiene en cuenta los días reales de cada mes, e incluso los años bisiestos

Lo usaré

gluglu 23-03-2011 16:21:27

Me alegro que te sirva ! :)

gluglu 23-03-2011 17:09:34

Yo tengo Firebird 2.1 instalado también.

He creado una tabla Días, y otra tabla Recepción. He ejecutado tu consulta que indicas arriba, y a mí me devuelve registros en NULL para todos aquellos días en los que no ha habido recepción de mercancías.

oscarac 23-03-2011 18:38:34

[quote=PacoPepe;394347]
Código SQL [-]
 
select d.dia, rm.suma from dias d left join (select extract(day from fecha) as dia, sum(kgs) as suma from Recepcion where ano = 2010 group by dia ) as rm on d.iddia = rm.dia
esta consulta la hice de esta manera y si me sale como tu quieres

Código SQL [-]
 
select d.dia, rm.suma from dias d left join (select dia, sum(kilos) as suma from consumo where anio = '2011' group by dia ) as rm on d.dia = rm.dia

PacoPepe 24-03-2011 10:08:12

Me podeis enviar la bbdd que habeis hecho

Gracias :confused:

gluglu 24-03-2011 10:35:53

Código SQL [-]
CREATE TABLE DIAS (
    DIA INTEGER);

INSERT INTO DIAS (DIA)
          VALUES (1);
INSERT INTO DIAS (DIA)
          VALUES (2);
INSERT INTO DIAS (DIA)
          VALUES (3);
INSERT INTO DIAS (DIA)
          VALUES (4);
INSERT INTO DIAS (DIA)
          VALUES (5);
INSERT INTO DIAS (DIA)
          VALUES (6);
INSERT INTO DIAS (DIA)
          VALUES (7);
INSERT INTO DIAS (DIA)
          VALUES (8);
INSERT INTO DIAS (DIA)
          VALUES (9);
INSERT INTO DIAS (DIA)
          VALUES (10);
COMMIT WORK;

CREATE TABLE RECEPCION (
    FECHA DATE,
    KGS INTEGER);
 
INSERT INTO RECEPCION (FECHA, KGS)
               VALUES ('2011-01-01', 1);
INSERT INTO RECEPCION (FECHA, KGS)
               VALUES ('2011-01-01', 1);
INSERT INTO RECEPCION (FECHA, KGS)
               VALUES ('2011-01-02', 3);
INSERT INTO RECEPCION (FECHA, KGS)
               VALUES ('2011-01-04', 4);
INSERT INTO RECEPCION (FECHA, KGS)
               VALUES ('2011-01-04', 4);
INSERT INTO RECEPCION (FECHA, KGS)
               VALUES ('2011-01-06', 6);
INSERT INTO RECEPCION (FECHA, KGS)
               VALUES ('2011-01-06', 6);
INSERT INTO RECEPCION (FECHA, KGS)
               VALUES ('2011-01-08', 8);
INSERT INTO RECEPCION (FECHA, KGS)
               VALUES ('2011-01-09', 9);
COMMIT WORK;

Aplico :
Código Delphi [-]
Select D.DIA, RM.SUMA from Dias D
left join (Select extract(day from fecha) as dia,
                  sum(kgs) as suma
           from Recepcion
           group by dia ) as RM
  on D.DIA = RM.DIA

y el resultado que obtengo es :
Código SQL [-]
DIA SUMA
  1    2
  2    3
  3    Null
  4    8
  5    Null
  6    12
  7    Null
  8    8
  9    9
 10    Null

fjcg02 24-03-2011 12:40:07

Yo creo que es porque estás haciendo mal la join. No sé porqué metes otra select.

Prueba esto. Debes tener la tabla días con 31 registros.
Código SQL [-]
Select D.DIA, sum(R.Kgs) from Dias D
left join Recepcion R on D.dia=extract(day from R.fecha)

group by D.dia

Luego nos comentas.

Saludos

elguille 25-03-2011 08:00:53

Cita:

Empezado por fjcg02 (Mensaje 394527)
Yo creo que es porque estás haciendo mal la join. No sé porqué metes otra select.

Prueba esto. Debes tener la tabla días con 31 registros.
Código SQL [-]Select D.DIA, sum(R.Kgs) as sumakilos from Dias D left join Recepcion R on D.dia=extract(day from R.fecha) group by D.dia


Luego nos comentas.

Saludos

Falta el mes y año

Select D.DIA, sum(R.Kgs) from Dias D
left join Recepcion R on D.dia=extract(day from R.fecha)
where extract(month from R.fecha)=el_mes and extract(year from R.fecha)=el_año
group by D.dia

Lo siento pero al editar el post no consigo que se vea como sentencia SQL

PacoPepe 25-03-2011 09:37:26

Muchas gracias gluglu, por fin funciona :p:p:p:p:p:p:p:p:p

Os agradezco a todos los que me habeis respondido vuestro interés por resolverme el problema

Un saludo a todos


La franja horaria es GMT +2. Ahora son las 20:05:44.

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