sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo pivotar? ¿Cómo convertir varias filas en una fila con varias columnas?

Edición MYSQL

Aquí está la consulta. La consulta unida genera RowNumber (1,2,3,...) para cada producto dentro de cada grupo de clientes usando Función MySQL de variables definidas por el usuario . La consulta externa forma una tabla PIVOT usando GROUP BY y CASO con números de fila de la tabla interna. Si necesita un recuento variable de columnas de productos, considere crear esta consulta dinámica agregando MAX(CASE WHEN p.RowNum=X THEN p.Product END) as ProductX a la lista de selección.

select Clients.ClientName,
       MAX(CASE WHEN p.RowNum=1 THEN p.Product END) as Product1,
       MAX(CASE WHEN p.RowNum=2 THEN p.Product END) as Product2,
       MAX(CASE WHEN p.RowNum=3 THEN p.Product END) as Product3,
       MAX(CASE WHEN p.RowNum=4 THEN p.Product END) as Product4


FROM Clients
JOIN
(
  SELECT Products.*,
       if(@ClientId<>ClientId,@rn:=0,@rn),
       @ClientId:=ClientId,
       @rn:[email protected]+1 as RowNum

  FROM Products, (Select @rn:=0,@ClientId:=0) as t
  ORDER BY ClientId,ProductID
 ) as P 
   ON Clients.ClientId=p.ClientId

GROUP BY Clients.ClientId

Demostración de SQLFiddle

Edición de SQL Server:

select Clients.ClientId,
       MAX(Clients.ClientName),
       MAX(CASE WHEN p.RowNum=1 THEN p.Product END) as Product1,
       MAX(CASE WHEN p.RowNum=2 THEN p.Product END) as Product2,
       MAX(CASE WHEN p.RowNum=3 THEN p.Product END) as Product3,
       MAX(CASE WHEN p.RowNum=4 THEN p.Product END) as Product4


FROM Clients
JOIN
(
  SELECT Products.*,
       ROW_NUMBER() OVER (PARTITION BY ClientID ORDER BY ProductID) 
         as RowNum

  FROM Products
 ) as P 
   ON Clients.ClientId=p.ClientId
GROUP BY Clients.ClientId

Demostración de SQLFiddle