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

error con sumar datos sql en consulta

Estas en el tema de error con sumar datos sql en consulta en el foro de SQL Server en Foros del Web. buen dia resulta que estoy sumando registros de articulos, pero cuano lo hago no me muestra la cantidad exacta... es como un stock..... primero sumo ...
  #1 (permalink)  
Antiguo 24/09/2009, 23:46
 
Fecha de Ingreso: septiembre-2007
Mensajes: 3
Antigüedad: 16 años, 7 meses
Puntos: 0
error con sumar datos sql en consulta

buen dia

resulta que estoy sumando registros de articulos, pero cuano lo hago no me muestra la cantidad exacta... es como un stock..... primero sumo todos los pedidos despues sumo las todas las ventas y despues resto la suma de ambas (stock), uso 3 tablas y a la hora de hacer una vista en sql los datos no son correctos, pues los compruebo..... ejemplo :

Las tablas son pequeñas, yo los hice asi para ver si funcionaban pero al parecer aun no logro hacer esta operacion
tengo un producto que se llama cuaderno, y asi tendria que quedar:

*** lo raro es que solamente con el producto "cuaderno" me hace mal la operacion, ya que el resto si me da el resultado correcto
--- asi me tendria que quedar:

producto-- ingreso --egreso --stock
cuadero ----- 18----- 8 ----- 10
Lapicero----- 45----- 12----- 33
Libro----- 25----- 3 ----- 22


pero sql solo me cuenta 5 en la columna de egreso, y yo ya rebice y me salen 8 .... esto me sucede cuando uso las 3 tablas (venta-pedido-producto)aqui esta el codigo que tengo

SELECT dbo.Producto.Id_Producto, dbo.Producto.Producto, SUM(DISTINCT dbo.Pedido.Cantidad) AS Entro, SUM(DISTINCT dbo.Venta.Cantidad) AS Egreso,
SUM(DISTINCT dbo.Pedido.Cantidad) - SUM(DISTINCT dbo.Venta.Cantidad) AS Stock
FROM dbo.Pedido INNER JOIN
dbo.Producto ON dbo.Pedido.Id_Producto = dbo.Producto.Id_Producto INNER JOIN
dbo.Venta ON dbo.Producto.Id_Producto = dbo.Venta.Id_Producto
GROUP BY dbo.Producto.Id_Producto, dbo.Producto.Producto

y este es le resultado, como podran ver esta mal:

id_producto--- Producto -- Entro -- Egreso -- Stock
1----- Cuaderno----- 18----- 5-----13
2----- Lapicero----- 45-----12-----33
3----- Libro----- 25----- 3 ----- 22

pero cuando realizo otra consulta aparte, solo que aqui uso solo la tabla de ventas y producto... y si me da el resultado correcto, vean

SELECT dbo.Producto.Id_Producto, dbo.Producto.Producto, SUM(dbo.Venta.Cantidad) AS Vendidos
FROM dbo.Producto INNER JOIN
dbo.Venta ON dbo.Producto.Id_Producto = dbo.Venta.Id_Producto
GROUP BY dbo.Producto.Id_Producto, dbo.Producto.Producto

el resultado:

Id_pro --- Producto -- Vendidos
1-----Cuaderno----- 8
2-----Lapicero----- 12
3-----Libro----- 3



ya rebice y aun no puedo encontrar el error, que sera?

de antemano gracias

Última edición por erick185; 24/09/2009 a las 23:51
  #2 (permalink)  
Antiguo 25/09/2009, 01:04
Avatar de Beakdan  
Fecha de Ingreso: diciembre-2001
Ubicación: Monterrey, Nuevo León
Mensajes: 433
Antigüedad: 22 años, 4 meses
Puntos: 7
Respuesta: error con sumar datos sql en consulta

Tu problema es el DISTINCT. Voy a explicar lo creo que ocurre, pero considero que debes de leer la documentación de SQL en cuanto a las funciones de agregado.
Supon que la tabla Producto tuviese los siguientes registros.

Id_pro --- Producto -- Cantidad
1-----Cuaderno----- 3
1-----Cuaderno----- 3
1-----Cuaderno----- 2

Aplicas un SUM y la consulta funciona como esperas. Aplica un SUM(DISTINCT), y el resultado será 5. El operador DISTINCT hará que solo se sumen las cantidades diferentes. Resultado inesperado, pero correcto de acuerdo a la documentación.

¿quizá te falta agrupar también con alguna otra columna de Venta o de Pedido?
  #3 (permalink)  
Antiguo 25/09/2009, 19:46
 
Fecha de Ingreso: septiembre-2007
Mensajes: 3
Antigüedad: 16 años, 7 meses
Puntos: 0
Respuesta: error con sumar datos sql en consulta

buen dia

fijate que algo asi como tu dices esta mi base, (lastima que no me permite introducir imagenes sino seria mejor de explicar)

aqui estan mis bases

********Tabla Pedidos****
Id_Pedido---------Fecha------Cantidad-----Id_Producto
--1-------02/01/2009 00:00-----10--------------1
--2-------03/01/2009 00:00-----20--------------2
--3-------03/01/2009 00:00-----15--------------3
--4-------05/02/2009 00:00------8---------------1
--5-------06/02/2009 00:00-----25--------------2
--6-------07/02/2009 00:00-----10--------------3


*****Tabla Ventas
Id_Venta--------Fecha----------Cantidad----Id_Producto
--1--------01/02/2009 00:00-------2-----------1
--2--------02/02/2009 00:00-------4-----------2
--3--------02/02/2009 00:00-------3-----------1
--4--------03/02/2009 00:00-------3-----------1
--5--------03/02/2009 00:00-------1-----------3
--6--------03/02/2009 00:00-------2-----------2
--7--------05/02/2009 00:00-------6-----------2
--8--------05/02/2009 00:00-------2-----------3

****Tabla Productos
Id_Producto-----Producto
--1-----------------Cuaderno
--2-----------------Lapicero
--3-----------------Libro


fijate que uso el sum distinct porque uso las 3 tablas(productos-pedido-ventas) y a la hora de colocar solo sum() me da un resultado que ni en cuenta, osea cuando si lo coloco me da este error,...... como lo podria realizar sin que me de error?

*** mira aqui lo hago sin el distinct

SELECT dbo.Producto.Id_Producto, dbo.Producto.Producto, SUM(dbo.Pedido.Cantidad) AS Entro, SUM(dbo.Venta.Cantidad) AS Egreso, SUM(dbo.Pedido.Cantidad)
- SUM(dbo.Venta.Cantidad) AS Stock
FROM dbo.Pedido INNER JOIN
dbo.Producto ON dbo.Pedido.Id_Producto = dbo.Producto.Id_Producto INNER JOIN
dbo.Venta ON dbo.Producto.Id_Producto = dbo.Venta.Id_Producto
GROUP BY dbo.Producto.Id_Producto, dbo.Producto.Producto

***este es el resultado que me da sin el Distinct:(nada que ver)
Id_---------Producto----------Pedidos------Ventas-------Stock
1------------Cuaderno------------54------------16------------38
2------------Lapicero------------135------------24-----------111
3------------Libro------------------50-------------6-------------44


--- Este resultado me tendria que dar:

Id_Producto-------Nombre----Pedidos---Salio---Stock
-----1--------------Cuaderno------18---------8-------10
-----2--------------Lapicero--------45--------12-------33
-----3--------------Libro------------25---------3--------22




salu2

Última edición por erick185; 25/09/2009 a las 19:58
  #4 (permalink)  
Antiguo 25/09/2009, 22:55
Avatar de Beakdan  
Fecha de Ingreso: diciembre-2001
Ubicación: Monterrey, Nuevo León
Mensajes: 433
Antigüedad: 22 años, 4 meses
Puntos: 7
Respuesta: error con sumar datos sql en consulta

Divide et Impera. Debes preagregar los valores antes de hacer el join con el catálogo base.

Código:
SET DATEFORMAT DMY;
DECLARE @Pedidos TABLE(
    Id_Pedido    INT NOT NULL,
    Fecha        DATETIME NOT NULL,
    Cantidad    INT NOT NULL,
    Id_Producto    INT NOT NULL
);
INSERT INTO    @Pedidos
SELECT    1, '02/01/2009 00:00', 10, 1 UNION ALL
SELECT    2, '03/01/2009 00:00', 20, 2 UNION ALL
SELECT    3, '03/01/2009 00:00', 15, 3 UNION ALL
SELECT    4, '05/02/2009 00:00',  8, 1 UNION ALL
SELECT    5, '06/02/2009 00:00', 25, 2 UNION ALL
SELECT    6, '07/02/2009 00:00', 10, 3;

DECLARE @Ventas TABLE(
    Id_Venta    INT NOT NULL,
    Fecha        DATETIME NOT NULL,
    Cantidad    INT NOT NULL,
    Id_Producto    INT NOT NULL
);
INSERT INTO    @Ventas
SELECT    1, '01/02/2009 00:00', 2, 1 UNION ALL
SELECT    2, '02/02/2009 00:00', 4, 2 UNION ALL
SELECT    3, '02/02/2009 00:00', 3, 1 UNION ALL
SELECT    4, '03/02/2009 00:00', 3, 1 UNION ALL
SELECT    5, '03/02/2009 00:00', 1, 3 UNION ALL
SELECT    6, '03/02/2009 00:00', 2, 2 UNION ALL
SELECT    7, '05/02/2009 00:00', 6, 2 UNION ALL
SELECT    8, '05/02/2009 00:00', 2, 3;

DECLARE @Productos TABLE(
    Id_Producto    INT NOT NULL,
    Producto    VARCHAR(15) NOT NULL
);
INSERT INTO @Productos
SELECT 1, 'Cuaderno' UNION ALL
SELECT 2, 'Lapicero' UNION ALL
SELECT 3, 'Libro';

SELECT        pr.Id_Producto,
            pr.Producto,
            pe.Pedidos,
            ve.Ventas,
            (pe.Pedidos - ve.Ventas) AS Stock
FROM        @Productos AS pr
            INNER JOIN    (
                SELECT        Id_Producto,
                            SUM(Cantidad) AS Pedidos
                FROM        @Pedidos
                GROUP BY    Id_Producto) AS pe
                        ON pr.Id_Producto = pe.Id_Producto
            INNER JOIN    (
                SELECT        Id_Producto,
                            SUM(Cantidad) AS Ventas
                FROM        @Ventas
                GROUP BY    Id_Producto) AS ve
                        ON pr.Id_Producto = ve.Id_Producto;
Saludos.
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 08:09.