将行转换为列和组

Convert rows to columns and group

第一列的记录可以是其他类型(1.1,1.2),取2简化例子。

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

当前输出:

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

预期输出: 对第一行进行分组,然后翻转其他列。在 'cantidad' 列没有记录的地方输入 0。

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

为什么不是条件聚合

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