Mysql
 sql >> Database >  >> RDS >> Mysql

Come ruotare? Come convertire più righe in una riga con più colonne?

Edizione MySQL

Ecco la domanda. La query unita genera RowNumber (1,2,3,...) per ogni prodotto all'interno di ciascun gruppo di client utilizzando Funzione MySQL variabili definite dall'utente . La query esterna forma una tabella PIVOT utilizzando GROUP BY e CASE con i numeri di riga della tabella interna. Se devi variare il conteggio delle colonne dei prodotti, considera la creazione di questa query dinamica aggiungendo MAX(CASE WHEN p.RowNum=X THEN p.Product END) as ProductX all'elenco di selezione.

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

Demo SQLFiddle

Edizione 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

Demo SQLFiddle