sql >> Databasteknik >  >> RDS >> Mysql

Hur pivoterar man? Hur konverterar man flera rader till en rad med flera kolumner?

MYSQL Edition

Här är frågan. Den kopplade frågan genererar RowNumber (1,2,3,...) för varje produkt inom varje kundgrupp med Användardefinierade variabler MySQL-funktion . Den yttre frågan bildar en PIVOT-tabell med GROUP BY och CASE med radnummer från den inre tabellen. Om du behöver variera antalet produktkolumner kan du överväga att skapa den här frågan dynamiskt och lägga till MAX(CASE WHEN p.RowNum=X THEN p.Product END) as ProductX till den valda listan.

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



  1. 7 sätt att kontrollera din Oracle-version

  2. Hur man formaterar ett tal som valuta i Oracle

  3. Varför börjar tabellnamn i SQL Server med dbo?

  4. Konvertera Unixtime till Datetime SQL (Oracle)