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

Hvordan pivoterer man? Hvordan konverterer man flere rækker til én række med flere kolonner?

MYSQL-udgave

Her er forespørgslen. Den tilknyttede forespørgsel genererer RowNumber (1,2,3,...) for hvert produkt inden for hver klientgruppe ved hjælp af Brugerdefinerede variabler MySQL-funktion . Den ydre forespørgsel danner en PIVOT-tabel ved hjælp af GROUP BY og CASE med rækkenumre fra den indre tabel. Hvis du har brug for at variere produktkolonneantal, så overvej at oprette denne forespørgsel dynamisk ved at tilføje MAX(CASE WHEN p.RowNum=X THEN p.Product END) as ProductX til valglisten.

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. Brug af strace som et DG40DBC Debugging Tool på Linux

  2. Tilføj unik begrænsning baseret på feltværdi

  3. OPRET TYPE på MySQL

  4. Hvordan sammenkæder jeg hele resultatsæt i MySQL?