sql >> Database >  >> RDS >> Mysql

Hoe draaien? Hoe converteer je meerdere rijen naar één rij met meerdere kolommen?

MYSQL-editie

Hier is de vraag. De samengevoegde query genereert RowNumber (1,2,3,...) voor elk product binnen elke klantgroep met behulp van Door gebruiker gedefinieerde variabelen MySQL-functie . De buitenste query vormt een PIVOT-tabel met behulp van GROUP BY en CASE met rijnummers uit de binnentabel. Als u het aantal productkolommen moet variëren, overweeg dan om deze query dynamisch toe te voegen door MAX(CASE WHEN p.RowNum=X THEN p.Product END) as ProductX naar de geselecteerde lijst.

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-editie:

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. mysql update een kolom met een int op basis van volgorde

  2. Geïndexeerde weergaven en statistieken

  3. Hoe te upgraden van MariaDB 10.4 naar MariaDB 10.5

  4. Hoe een versie 4 (willekeurige) UUID op Oracle te genereren?