Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como pivotar? Como converter várias linhas em uma linha com várias colunas?


Edição MySQL

Aqui está a consulta. A consulta associada gera RowNumber (1,2,3,...) para cada produto dentro de cada grupo de clientes usando Recurso MySQL de variáveis ​​definidas pelo usuário . A consulta externa forma uma tabela PIVOT usando GROUP BY e CASE com Números de Linha da tabela interna. Se você precisar de contagem de colunas de produtos variáveis, considere criar esta consulta dinâmica adicionando MAX(CASE WHEN p.RowNum=X THEN p.Product END) as ProductX para a lista de seleção.
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

Demonstração do SQLFiddle

Edição do 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

Demonstração do SQLFiddle