Wersja MYSQL
Oto zapytanie. Sprzężone zapytanie generuje RowNumber (1,2,3,...) dla każdego produktu w każdej grupie klientów przy użyciu Funkcja MySQL Zmienne definiowane przez użytkownika
. Zewnętrzne zapytanie tworzy tabelę PIVOT przy użyciu GROUP BY
i CASE z numerami wierszy z tabeli wewnętrznej. Jeśli chcesz zmienić liczbę kolumn produktów, rozważ utworzenie tego zapytania z dynamicznym dodaniem MAX(CASE WHEN p.RowNum=X THEN p.Product END) as ProductX
do listy wyboru.
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