Phiên bản MYSQL
Đây là truy vấn. Truy vấn đã kết hợp tạo RowNumber (1,2,3, ...) cho mỗi sản phẩm bên trong mỗi nhóm khách hàng bằng cách sử dụng Tính năng MySQL của biến do người dùng xác định
. Truy vấn bên ngoài tạo thành bảng PIVOT bằng cách sử dụng GROUP BY
và CASE với Số hàng từ bảng bên trong. Nếu bạn cần thay đổi số lượng cột sản phẩm thì hãy cân nhắc tạo truy vấn động này bằng cách thêm MAX(CASE WHEN p.RowNum=X THEN p.Product END) as ProductX
vào danh sách đã chọ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
Phiên bản 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