Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment pivoter ? Comment convertir plusieurs lignes en une seule ligne avec plusieurs colonnes ?

Édition MYSQL

Voici la requête. La requête jointe génère RowNumber (1,2,3,...) pour chaque produit dans chaque groupe de clients en utilisant Fonctionnalité MySQL des variables définies par l'utilisateur . La requête externe forme un tableau croisé dynamique en utilisant GROUP BY et CASE avec les numéros de ligne du tableau interne. Si vous avez besoin de faire varier le nombre de colonnes de produits, envisagez de créer cette requête dynamique en ajoutant MAX(CASE WHEN p.RowNum=X THEN p.Product END) as ProductX à la liste de sélection.

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

Démo SQLFiddle

Édition 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

Démo SQLFiddle