sql >> Databáze >  >> RDS >> Mysql

Jak pivotovat? Jak převést více řádků na jeden řádek s více sloupci?

Vydání MYSQL

Zde je dotaz. Spojený dotaz vygeneruje RowNumber (1,2,3,...) pro každý produkt v každé skupině klientů pomocí Funkce MySQL pro proměnné definované uživatelem . Vnější dotaz tvoří PIVOT tabulku pomocí GROUP BY a CASE s čísly řádků z vnitřní tabulky. Pokud potřebujete změnit počet sloupců produktů, zvažte vytvoření tohoto dotazu dynamické přidání MAX(CASE WHEN p.RowNum=X THEN p.Product END) as ProductX do výběrového seznamu.

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

Ukázka SQLFiddle

Vydání 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

Ukázka SQLFiddle



  1. Šifrování v klidu a/nebo AES_ENCRYPT

  2. Jak ověřit přihlašovací údaje uživatele v systému Android pomocí PHP, MySql s pomocí json

  3. Jak předat heslo do pg_dump?

  4. Obnova databáze MySQL z fyzických souborů