Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Duplica al agrupar (https://www.clubdelphi.com/foros/showthread.php?t=94783)

Carmelo Cash 15-07-2020 03:00:33

Duplica al agrupar
 
Hola Foro:

Necesito agrupar dos tablas por mes, una tiene el total de la factura y otra el detalle.

El resultado que se necesita obtener, es la suma de los ID_conceptos ( 101 + 102 ) agrupados por mes.(*)

MES, Total, Cantidad
5 ,1911.20, 140 (10+25+20+50+10+25)

Más abajo encontrarán los create e incert si quieren cargar las tablas para probar.

Estoy usando Firebird 2.5

Desde ya gracias por su atención. :cool:

Las tablas son estas:

tabla VentasABC
ID_Venta MES , Total
1 , 5 , 456.10
2 , 5 , 999.00
3 , 5 , 456.00

Tabla DetalleABC
ID_Venta, ID_Concepto, Cantidad
1 , 101 , 10 *
1 , 102 , 25 *
1 , 103 , 30
2 , 101 , 20 *
2 , 102 , 50 *
2 , 103 , 90
3 , 101 , 10 *
3 , 102 , 25 *
3 , 103 , 30

Estoy haciendo esto....

Código SQL [-]
Select v.Mes, sum(v.Total) as Total, sum(d.cantidad) as Cantidad
from VentasABC v
join DetalleABC d on d.ID_Venta=v.ID_Venta
Where d.ID_Concepto in (101,102)
group by v.mes

... Pero me duplica el campo v.Total


Acá estan los create y los insert.

Código SQL [-]
Create table VentasABC (
ID_Venta Integer,
MES Integer,
Total Numeric (15,2) );

Insert into VentasABC Values (1, 5, 456.10);
Insert into VentasABC Values (2, 5, 999.00);
Insert into VentasABC Values (3, 5, 456.10);

Create table DetalleABC (
ID_Venta Integer,
ID_Concepto Integer,
Cantidad Numeric (15,2));

Insert into DetalleABC values (1 , 101,10);
Insert into DetalleABC values (1 , 102,25);
Insert into DetalleABC values (1 , 103,30);
Insert into DetalleABC values (2 , 101,20);
Insert into DetalleABC values (2 , 102,50);
Insert into DetalleABC values (2 , 103,90);
Insert into DetalleABC values (3 , 101,10);
Insert into DetalleABC values (3 , 102,25);
Insert into DetalleABC values (3 , 103,30);
Nota: Sumar distintos ID_Conceptos puede parecer raro (sumar papas + cebollas) pero en este caso son distintos ID_Conceptos que responden a un mismo tipo de articulo.

mRoman 15-07-2020 03:14:13

Pues acabo de hacer una prueba y arroja esto:

Código SQL [-]
MES  TOTAL  CANTIDAD
5  3822.4  140

No duplica nada...cree las tablas e inserte los registros que enviaste y ejecute el query...y lo hace bien, muestra 1 sola linea con los datos q puse arriba.

Carmelo Cash 15-07-2020 05:29:35

Hola. Si, Duplica
 
Si, Duplica el Total

Fijate que el total te da 3822.4

y 456.10 + 999.00 + 456.10 = 1911.20

Eso es lo que está mal.

aposi 15-07-2020 10:06:02

Hola, prueba con un left join


Código SQL [-]
Select v.Mes, sum(v.Total) as Total, sum(d.cantidad) as Cantidad
from VentasABC v 
left join DetalleABC d on d.ID_Venta=v.ID_Venta 
Where d.ID_Concepto in (101,102) 
group by v.mes

bucanero 15-07-2020 14:00:22

prueba con esta consulta:

Código:

SELECT v.Mes, sum(v.Total) AS Total, sum(d.cantidad) AS Cantidad
  FROM VentasABC v
      LEFT JOIN (SELECT ID_Venta, sum(cantidad) AS cantidad
                    FROM DetalleABC
                  WHERE ID_Concepto IN (101, 102)) d
          ON d.ID_Venta = v.ID_Venta
GROUP BY v.mes


mRoman 15-07-2020 17:32:07

Cita:

Empezado por Carmelo Cash (Mensaje 537965)
Si, Duplica el Total

Fijate que el total te da 3822.4

y 456.10 + 999.00 + 456.10 = 1911.20

Eso es lo que está mal.

Ah, lo SUMA 2 VECES...lo entendí mal.

mRoman 15-07-2020 17:52:02

Cita:

Empezado por bucanero (Mensaje 537968)
prueba con esta consulta:

Código:

SELECT v.Mes, sum(v.Total) AS Total, sum(d.cantidad) AS Cantidad
  FROM VentasABC v
      LEFT JOIN (SELECT ID_Venta, sum(cantidad) AS cantidad
                    FROM DetalleABC
                  WHERE ID_Concepto IN (101, 102)) d
          ON d.ID_Venta = v.ID_Venta
GROUP BY v.mes


Aplicando esta consulta de BUCANERO si se obtiene lo q buscas, solo que hizo falta algo en el código:
Código SQL [-]
Select v.Mes,
       sum(v.Total) as Total,
       sum(d.cantidad) as Cantidad
from VentasABC v
  left join (select id_venta,
                    sum(cantidad) as cantidad
             from DetalleABC
             where id_concepto in (101,102)
             group by id_venta) d
  on d.ID_Venta=v.ID_Venta
group by v.mes

lo q esta en rojo es lo que hizo falta

Carmelo Cash 17-07-2020 02:01:36

Listo
 
Gracias a todos, al final lo dejé asi.

Como siempre, los participantes de este foro son geniales.

Gracias mRoman, Bucanero y posi.

Saludos :cool:

Código SQL [-]
Select v.Mes, sum(v.Total) as Total, 
sum( (select sum(d.cantidad) 
      from  detalleABC d 
      where  d.ID_Venta=v.ID_Venta
      and d.ID_Concepto in (101,102)))
from VentasABC v
group by v.mes


La franja horaria es GMT +2. Ahora son las 15:31:05.

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