sql >> データベース >  >> RDS >> Mysql

ピボットする方法は?複数の行を複数の列を持つ1つの行に変換するにはどうすればよいですか?

    MYSQL Edition

    これがクエリです。結合されたクエリは、ユーザー定義変数MySQL機能 。外部クエリは、GROUP BYを使用してピボットテーブルを形成します 内側のテーブルの行番号を使用したCASE。製品の列数を変更する必要がある場合は、このクエリを動的に作成して、MAX(CASE WHEN p.RowNum=X THEN p.Product END) as ProductX 選択リストに移動します。

    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デモ

    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デモ



    1. MySQL:いくつかの列のMAXまたはGREATESTを取得しますが、フィールドはNULLです

    2. それぞれの一意の値とカウントを取得する

    3. 使用を終了します開いているSQL接続を閉じます

    4. cronジョブで動的関数をスケジュールする方法は?