将行转换为列和组
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
第一列的记录可以是其他类型(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