Home > database >  Convert rows to columns and group
Convert rows to columns and group

Time:05-28

The records in the first column can be of another type (1.1, 1.2), just take 2 to simplify the example.

SELECT com.NombrePuntoEntrega as Comedor, 
       a.NombreArea,  
       SUM(s.CantidadRaciones) as Cantidad
FROM PPA_SolicitudRaciones c inner join  
     PPA_SolicitudRacionesDET S on c.IdSolicitud =s.IdSolicitud and s.IdLocalidad =c.IdLocalidad 
     INNER JOIN PPA_AREAS A ON A.IDLOCALIDAD=S.IDLOCALIDAD  and a.IdArea =s.IdArea 
     INNER JOIN PPA_PuntosEntrega com on com.IdLocalidad =s.IdLocalidad and com.IdPuntoEntrega =s.IdPuntoEntrega 
WHERE (s.IdLocalidad =@IdLocalidad or @IdLocalidad =0)
     AND (s.IdArea =@IdArea or @IdArea =0)
     AND (c.FechaPedido between @FechaDel and @FechaAl   or   @FechaDel ='1900.01.01' )
     AND (c.IdTipoComida  =@TipoComida or @TipoComida=0)
GROUP BY com.NombrePuntoEntrega, a.NombreArea

Current output:

Comedor Nombre Area Cantidad
1.1 APLICACIONES 200
1.2 APLICACIONES 300
1.1 ARANDANOS 1000
1.1 PALTO 20
1.2 PALTO 30

Expected output: groups the first row and then flips the other columns. Put a 0 where there are no records for the 'cantidad' column.

Comedor APLICACIONES ARANDANOS PALTO
1.1 200 1000 20
1.2 300 0 30

CodePudding user response:

Why not a conditional aggregation

SELECT Comedor      = com.NombrePuntoEntrega 
      ,APLICACIONES = SUM(case when a.NombreArea = 'APLICACIONES' then s.CantidadRaciones else 0 end) 
      ,ARANDANOS    = SUM(case when a.NombreArea = 'ARANDANOS'    then s.CantidadRaciones else 0 end) 
      ,PALTO        = SUM(case when a.NombreArea = 'PALTO'        then s.CantidadRaciones else 0 end) 
  FROM PPA_SolicitudRaciones c inner join  
       PPA_SolicitudRacionesDET S on c.IdSolicitud =s.IdSolicitud and s.IdLocalidad =c.IdLocalidad 
 INNER JOIN PPA_AREAS A ON A.IDLOCALIDAD=S.IDLOCALIDAD  and a.IdArea =s.IdArea 
 INNER JOIN PPA_PuntosEntrega com on com.IdLocalidad =s.IdLocalidad and com.IdPuntoEntrega =s.IdPuntoEntrega 
 WHERE (s.IdLocalidad =@IdLocalidad or @IdLocalidad =0)
    AND (s.IdArea =@IdArea or @IdArea =0)
    AND (c.FechaPedido between @FechaDel and @FechaAl   or   @FechaDel ='1900.01.01' )
    AND (c.IdTipoComida  =@TipoComida or @TipoComida=0)
 GROUP BY com.NombrePuntoEntrega
  • Related