Ver Mensaje Individual
  #4 (permalink)  
Antiguo 25/09/2009, 22:55
Avatar de Beakdan
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.