MYSQL издание
Ето и запитването. Обединената заявка генерира RowNumber (1,2,3,...) за всеки продукт във всяка клиентска група, използвайки Функция MySQL за потребителски дефинирани променливи
. Външната заявка формира PIVOT таблица, използвайки GROUP BY
и CASE с номера на редове от вътрешната таблица. Ако трябва да промените броя на колоните с продукти, помислете за създаването на тази заявка за динамично добавяне на MAX(CASE WHEN p.RowNum=X THEN p.Product END) as ProductX
към списъка за избор.
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