none
Problema con Group BY Sql Server 2012. RRS feed

  • Pregunta

  • Buenas tardes a tod@s.

    Estimados, tengo un problema con la siguiente consulta:

    declare @FechaInicial as datetime
    set @FechaInicial='2020-01-01' 
    declare @FechaFinal as datetime
    set @FechaFinal='2020-01-25'
    
    SELECT  z.zona as Zonas
            ,case  when  nc.movimiento  != 'nd' then (SUM(nc.subtotal)) else 0 end AS NC
           ,case  when  nc.movimiento = 'nd' then (SUM(nc.subtotal)) else 0 end AS ND
    	   
    	  
    FROM DBO.NotaCredito AS nc inner JOIN DBO.CLientes AS C
    ON nc.idcliente=C.idcliente inner JOIN DBO.Zonas AS Z
    ON C.idzona = Z.idzona 
    where nc.fecha >= @FechaInicial and nc.fecha < @FechaFinal
    group by z.zona,nc.movimiento
    

    Esta consulta me debería de agrupar NC y ND por zonas, pero si se fijan no lo esta haciendo las filas 4 y 5 corresponden a la misma zona.

    Si alguien me puede indicar el motivo, se lo agradecería.

    Gracias.

    viernes, 24 de enero de 2020 20:41

Respuestas

  • Reynaldo, la forma de utilizar las funciones de agregación con CASE es algo no intuitivo en SQL Server.

    Cambie

           ,case  when  nc.movimiento  != 'nd' then (SUM(nc.subtotal)) else 0 end AS NC
           ,case  when  nc.movimiento = 'nd' then (SUM(nc.subtotal)) else 0 end AS ND

    a

           ,SUM (case  when  nc.movimiento  != 'nd' then nc.subtotal else 0 end) AS NC
           ,SUM (case  when  nc.movimiento = 'nd' then nc.subtotal else 0 end) AS ND

    y elimine la columna nc.movimiento del GROUP BY.

    El código SQL final es este:

    -- código #1
    declare @FechaInicial as datetime; set @FechaInicial='2020-01-01'; declare @FechaFinal as datetime; set @FechaFinal='2020-01-25'; SELECT z.zona as Zonas        ,SUM (case  when  nc.movimiento  != 'nd' then nc.subtotal else 0 end) AS NC
           ,SUM (case  when  nc.movimiento = 'nd' then nc.subtotal else 0 end) AS ND FROM DBO.NotaCredito AS nc
    inner join DBO.CLientes AS C ON nc.idcliente = C.idcliente
    inner join DBO.Zonas AS Z ON C.idzona = Z.idzona where nc.fecha >= @FechaInicial and nc.fecha < @FechaFinal group by z.zona;





    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz viernes, 24 de enero de 2020 22:22
    • Marcado como respuesta Reynaldo Sanchez viernes, 24 de enero de 2020 22:48
    viernes, 24 de enero de 2020 22:19

Todas las respuestas

  • Reynaldo, la forma de utilizar las funciones de agregación con CASE es algo no intuitivo en SQL Server.

    Cambie

           ,case  when  nc.movimiento  != 'nd' then (SUM(nc.subtotal)) else 0 end AS NC
           ,case  when  nc.movimiento = 'nd' then (SUM(nc.subtotal)) else 0 end AS ND

    a

           ,SUM (case  when  nc.movimiento  != 'nd' then nc.subtotal else 0 end) AS NC
           ,SUM (case  when  nc.movimiento = 'nd' then nc.subtotal else 0 end) AS ND

    y elimine la columna nc.movimiento del GROUP BY.

    El código SQL final es este:

    -- código #1
    declare @FechaInicial as datetime; set @FechaInicial='2020-01-01'; declare @FechaFinal as datetime; set @FechaFinal='2020-01-25'; SELECT z.zona as Zonas        ,SUM (case  when  nc.movimiento  != 'nd' then nc.subtotal else 0 end) AS NC
           ,SUM (case  when  nc.movimiento = 'nd' then nc.subtotal else 0 end) AS ND FROM DBO.NotaCredito AS nc
    inner join DBO.CLientes AS C ON nc.idcliente = C.idcliente
    inner join DBO.Zonas AS Z ON C.idzona = Z.idzona where nc.fecha >= @FechaInicial and nc.fecha < @FechaFinal group by z.zona;





    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz viernes, 24 de enero de 2020 22:22
    • Marcado como respuesta Reynaldo Sanchez viernes, 24 de enero de 2020 22:48
    viernes, 24 de enero de 2020 22:19
  • Muchas Gracias José Días, me ha funcionado.
    viernes, 24 de enero de 2020 22:48