none
suma con condición. RRS feed

  • Pregunta

  • Hola buenos días a todos.

    Estimados, necesito hacer una consulta en donde necesito sumar una columna tomando en cuenta una condición me explico:

    Tengo una factura en la cual se facturan x cantidades de productos y en su detalle hay una columna que almacena el tipo de valorado de cada ítem de la siguiente manera:

    Entonces yo quiero que en la consulta sume la columna “Columna1” en donde Tipo Valoración sea igual a “Valorado” y  Bonificado xC o Bonificado xU, al final me quedaría como el ejemplo de arriba em donde el Total Costo Bonificado= C$ 716.98  y Total Costo Valorado = C$ 66,870.00

    La siguiente consulta debería de darme el resultado que deseo, pero no me da.

      declare @FechaInicio  datetime
      set  @FechaInicio='2019-10-01'
      declare @FechaFin datetime
       set @FechaFin='2019-10-31'
    
      set nocount on
    
       declare @tableSaleOne table(cliente nvarchar(100),factura int,total numeric(18,2),zona nvarchar(50)) --Table one
      
                  insert into @tableSaleOne(cliente,factura, total, zona)
                           select c.cliente +' - '+ left(c.direccion,10) +''+ '...',dv.numero_factura,sum(dv.total) as valor_factura,z.zona
                                                                              from dbo.DetalleVenta  as dv inner join
    																		  dbo.Venta as v on dv.idventa=v.idventa inner join
                                                                               dbo.CLientes as c on v.idcliente = c.idcliente  inner join
    																		   dbo.Zonas as z on c.idzona = z.idzona
                                                                               where dv.fecha_contabilizada >= @FechaInicio and dv.fecha_contabilizada < @FechaFin
                                                                               group by z.zona,c.cliente,c.direccion,dv.numero_factura  
      
      declare @TableSales2 table(factura int,utilidad numeric(18,2),cxf_v  numeric(18,2)) 
                 insert into @TableSales2(factura,utilidad,cxf_v)
    			                   select dv.numero_factura as factura 
                                          ,dv.total - (cp.coste * (dv.cantidad/cast(dv.contenia as float))) as utilidad 
    									  ,(cp.coste * (dv.cantidad/cast(dv.contenia as float))) as cxf_valorado								   
    										   from dbo.DetalleVenta as dv inner join
                                               dbo.CostesProductos as cp on dv.idproducto = cp.idproducto inner join
    										   dbo.Productos as p on dv.idproducto = p.idproducto
                                               where dv.fecha_contabilizada >= @FechaInicio and dv.fecha_contabilizada < @FechaFin and mayor_detalle='Valorado'
    									
    declare @TableSales3 table(factura int,cxf_B  numeric(18,2)) 
            insert into @TableSales3(factura,cxf_B) 
    		                    (select   dv.numero_factura as factura
    							          ,(cp.coste * (dv.cantidad/cast(dv.contenia as float))) as cxf_Bonificado
                                               from dbo.DetalleVenta as dv inner join
                                               dbo.CostesProductos as cp on dv.idproducto = cp.idproducto inner join
    										   dbo.Productos as p on dv.idproducto = p.idproducto
                                               where dv.fecha_contabilizada >= @FechaInicio and dv.fecha_contabilizada < @FechaFin and mayor_detalle='Regalía xC' or mayor_detalle='Regalía xU' )
        									               									  
                                            
      
      select t1.zona
            ,t1.cliente as cliente
    		,t1.factura as Factura
    		,t1.total as Valor
    		,sum(t2.utilidad) as Utilidad
    		,sum(t2.cxf_v) as Costo_Valorado
    		,sum(t3.cxf_B) as Costo_Bonificado
    		
    		
      from @tableSaleOne as t1 inner join @TableSales2 as t2 on t1.factura=t2.factura inner join @TableSales3 as t3 on t1.factura=t3.factura  
      group by t1.zona,t1.cliente,t1.factura,t1.total
      order by 1 asc;

    espero me puedan ayudar, gracias.

    viernes, 3 de enero de 2020 16:02

Respuestas

  • Hola Reynaldo Sanchez:

    Para realizar una suma de una columna, pero no en todos los casos tienes sum(case when expresión then valor else valor end) as sumada.

    O lo que es lo mismo, puedes hacer sum(case when valorado = 'xxx' and modificado ='yyy' and otracondicion = '' then columna1 end) y así solo sumará columna1 cunado se cumplan esas condiciones.

    viernes, 3 de enero de 2020 16:45

Todas las respuestas

  • Hola Reynaldo Sanchez:

    Para realizar una suma de una columna, pero no en todos los casos tienes sum(case when expresión then valor else valor end) as sumada.

    O lo que es lo mismo, puedes hacer sum(case when valorado = 'xxx' and modificado ='yyy' and otracondicion = '' then columna1 end) y así solo sumará columna1 cunado se cumplan esas condiciones.

    viernes, 3 de enero de 2020 16:45
    • Hola Javier, el detalle es que necesito separar el resultado para mostrarlos por separados.

    he hecho lo que me propones y el resultado no coincide, con los datos grabados.

    viernes, 3 de enero de 2020 18:38
  • Hola Reynado Sanchez:

    Y porque no muestras lo que has hecho, y explicas mucho mejor que significa separar los resultados.

    Fijate que tú sabes de lo que hablas, pero el resto de usuarios, en cada entrada vemos una imagen, que viene de una consulta que no se puede parecer a la anterior, porque son diferentes columnas.


    viernes, 3 de enero de 2020 18:57