Solución:
Edición MYSQL
Aquí está la consulta. La consulta unida genera RowNumber (1,2,3, …) para cada producto dentro de cada grupo de clientes utilizando la función de variables definidas por el usuario MySQL. La consulta externa forma una tabla PIVOT usando GROUP BY
y CASE con los números de fila de la tabla interior. Si necesita el recuento de columnas de productos variables, considere la posibilidad de crear esta consulta agregando dinámicamente 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
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)