Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak się obracać? Jak przekonwertować wiele wierszy w jeden wiersz z wieloma kolumnami?

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

demonstracja SQLFiddle

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

Demo 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. Zapytanie MySQL w pętli a użycie sprzężenia SQL

  2. AndroidApp i MySqlConnection nie działały connection.open

  3. Jakie są ustawienia sterownika JDBC-mysql dla rozsądnej obsługi DATETIME i TIMESTAMP w UTC?

  4. Błąd składni lub naruszenie dostępu:1059 Nazwa identyfikatora jest za długa

  5. Zmień unikalny klucz razem w mysql