none
Suma de campos en una tabla con un mismo filtro aplicado a 2 columnas de fechas. RRS feed

  • Pregunta

  • Hola

    En SQL 2012 tengo una tabla con pedidos y ventas de forma tal que las lineas de pedidos tienen fechapedido cuando se crea y fechaventa si se ha vendido todo o alguna linea, queda mas o menos así: 

    DECLARE @tabla TABLE (cliente int,pedido int,linea int, articulo char(1),cantidad int,precio decimal(5,2),fechapedido date,fechaventa date )
    INSERT INTO @tabla VALUES
    (1,1,1,'A',1,0.1,'20180601',NULL),
    (1,1,2,'B',2,0.2,'20180601','20180601'),
    (1,1,3,'C',3,0.3,'20180601','20180601'),
    (1,2,1,'A',4,0.1,'20180601','20180601'),
    (1,2,2,'B',5,0.2,'20180601',NULL),
    (1,2,3,'C',6,0.3,'20180601',NULL),
    (2,1,1,'A',1,1.1,'20180601',NULL),
    (2,1,2,'B',2,1.2,'20180601','20180601'),
    (2,1,3,'C',3,1.3,'20180601','20180601'),
    (2,2,1,'A',4,1.1,'20180601','20180601'),
    (2,2,2,'B',5,1.2,'20180601',NULL),
    (2,2,3,'C',6,1.3,'20180601',NULL)

    y obtengo este resultado 

    cliente,ImportePedido,ImporteVentas
    1 4.60 1.70
    2 25.60 10.70

    de dos formas que son las siguientes

    -- 1 --
    DECLARE @table TABLE (cliente int  ,ImportePedido decimal(5,2) default(0) ,ImporteVentas decimal(5,2) default(0))

    INSERT INTO @table (cliente,importepedido)
    SELECT cliente,SUM(cantidad*precio) AS ImportePedido FROM @tabla T1
    WHERE fechapedido BETWEEN '20180601' AND '20180630'
    GROUP BY cliente

    MERGE @table AS destino
    USING (
    SELECT cliente,SUM(cantidad*precio) AS ImporteVentas FROM @tabla T1
    WHERE T1.fechaventa BETWEEN '20180601' AND '20180630' AND cliente = T1.cliente 
    GROUP BY cliente ) AS origen (cliente,ImporteVentas)
    ON (destino.cliente = origen.cliente)
    WHEN MATCHED THEN UPDATE SET ImporteVentas = origen.ImporteVentas;
    SELECT * FROM @table

    -- 2 --
    SELECT cliente,SUM(ImportePedido),SUM(ImporteVentas) FROM (
    SELECT cliente,cantidad*precio AS ImportePedido
    ,CASE WHEN fechaventa BETWEEN '20180601' AND '20180630' THEN cantidad*precio ELSE 0 END AS ImporteVentas
    FROM @tabla T1
    WHERE fechapedido BETWEEN '20180601' AND '20180630' ) AS T
    GROUP BY cliente

    Tengo mas que claro que no son para nada optimas de forma que he probado con un INNER JOIN con ella misma, con CROSS APPLY, etc. y obtengo campos repetidos y sin el resultado correcto. Por eso os pregunto y les pido ¿ alguna forma mas optima o más coherente ?

    Muchas gracias de antemano y saludos
    miércoles, 20 de junio de 2018 22:34

Respuestas

  • Hola Raimundo Ferrer:

    A lo mejor te sirve algo como esto:

    select p.cliente, sum(p.cantidad * p.precio) as importe , 
    sum(case when not p.fechaventa is null then (p.cantidad * p.precio) else 0 end) as importeventas from pedcli p
    group by p.cliente

    La tabla la llame pedcliente.

    Un saludo

    jueves, 21 de junio de 2018 6:14
  • Hola Raimundo Ferrer:

    A lo mejor te sirve algo como esto:

    select p.cliente, sum(p.cantidad * p.precio) as importe , 
    sum(case when not p.fechaventa is null then (p.cantidad * p.precio) else 0 end) as importeventas from pedcli p
    group by p.cliente

    La tabla la llame pedcliente.

    Un saludo

    Hola

    No había estado por acá en unos días, gracias Javi por tu respuesta. Saludos a todos.

    sábado, 7 de julio de 2018 7:03

Todas las respuestas

  • Hola Raimundo Ferrer:

    A lo mejor te sirve algo como esto:

    select p.cliente, sum(p.cantidad * p.precio) as importe , 
    sum(case when not p.fechaventa is null then (p.cantidad * p.precio) else 0 end) as importeventas from pedcli p
    group by p.cliente

    La tabla la llame pedcliente.

    Un saludo

    jueves, 21 de junio de 2018 6:14
  • Hola Raimundo Ferrer:

    A lo mejor te sirve algo como esto:

    select p.cliente, sum(p.cantidad * p.precio) as importe , 
    sum(case when not p.fechaventa is null then (p.cantidad * p.precio) else 0 end) as importeventas from pedcli p
    group by p.cliente

    La tabla la llame pedcliente.

    Un saludo

    Hola

    No había estado por acá en unos días, gracias Javi por tu respuesta. Saludos a todos.

    sábado, 7 de julio de 2018 7:03