Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie schwenken? Wie konvertiere ich mehrere Zeilen in eine Zeile mit mehreren Spalten?

MYSQL-Edition

Hier ist die Abfrage. Die verbundene Abfrage generiert RowNumber (1,2,3,...) für jedes Produkt innerhalb jeder Client-Gruppe mit MySQL-Funktion für benutzerdefinierte Variablen . Die äußere Abfrage bildet mit GROUP BY eine PIVOT-Tabelle und CASE mit Zeilennummern aus der inneren Tabelle. Wenn Sie die Anzahl der Produktspalten variieren müssen, sollten Sie diese Abfrage dynamisch erstellen und MAX(CASE WHEN p.RowNum=X THEN p.Product END) as ProductX hinzufügen zur Auswahlliste.

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

SQLFiddle-Demo

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

SQLFiddle-Demo