Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Làm thế nào để xoay? Làm thế nào để chuyển đổi nhiều hàng thành một hàng có nhiều cột?

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

Bản trình diễn SQLFiddle

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

Bản trình diễn SQLFiddle



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sử dụng khóa chính tổng hợp làm khóa ngoại

  2. Khi nào thì Class.forName cần thiết khi kết nối với cơ sở dữ liệu qua JDBC trong một ứng dụng web?

  3. Hướng dẫn sử dụng Sphinx với PHP và MySQL

  4. Không thể tải lớp trình điều khiển JDBC [com.mysql.jdbc.Driver]

  5. Sử dụng PHP để tải tệp lên và thêm đường dẫn đến cơ sở dữ liệu MySQL