MYSQL Edition
Här är frågan. Den kopplade frågan genererar RowNumber (1,2,3,...) för varje produkt inom varje kundgrupp med Användardefinierade variabler MySQL-funktion
. Den yttre frågan bildar en PIVOT-tabell med GROUP BY
och CASE med radnummer från den inre tabellen. Om du behöver variera antalet produktkolumner kan du överväga att skapa den här frågan dynamiskt och lägga till MAX(CASE WHEN p.RowNum=X THEN p.Product END) as ProductX
till den valda listan.
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
SQL Server Edition:
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