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

mysqlピボットテーブルの日付(垂直から水平のデータ)

    この結果を得るには、ピボットする必要があります。 データ。 MySQLにはピボット関数はありませんが、CASEで集計関数を使用できます。 表現。

    日付の数がわかっている場合は、クエリをハードコーディングできます:

    select client_id,
      max(case when rownum = 1 then date end) Date1,
      max(case when rownum = 2 then date end) Date2,
      max(case when rownum = 3 then date end) Date3
    from
    (
      select client_id,
        date,
        @row:=if(@prev=client_id, @row,0) + 1 as rownum,
        @prev:=client_id 
      from yourtable, (SELECT @row:=0, @prev:=null) r
      order by client_id, date
    ) s
    group by client_id
    order by client_id, date
    

    SQL Fiddle withDemo を参照してください。

    client_id内の各レコードに行番号を割り当てるためにユーザー変数を実装しました グループ。

    日付の数が不明な場合は、プリペアドステートメントを使用してSQLを動的に作成する必要があります。

    SET @sql = NULL;
    SELECT
      GROUP_CONCAT(DISTINCT
        CONCAT(
          'MAX(CASE WHEN rownum = ',
          rownum,
          ' THEN date END) AS Date_',
          rownum
        )
      ) INTO @sql
    from
    (
      select client_id,
        date,
        @row:=if(@prev=client_id, @row,0) + 1 as rownum,
        @prev:=client_id 
      from yourtable, (SELECT @row:=0) r
      order by client_id, date
    ) s
    order by client_id, date;
    
    
    SET @sql 
      = CONCAT('SELECT client_id, ', @sql, ' 
               from
               (
                 select client_id,
                   date,
                   @row:=if(@prev=client_id, @row,0) + 1 as rownum,
                   @prev:=client_id 
                 from yourtable, (SELECT @row:=0) r
                 order by client_id, date
               ) s
               group by client_id
               order by client_id, date');
    
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
    

    SQL Fiddle withDemo を参照してください。 。

    どちらも結果を出します:

    | CLIENT_ID |                          DATE_1 |                          DATE_2 |                     DATE_3 |
    --------------------------------------------------------------------------------------------------------------
    |         1 | February, 03 2013 00:00:00+0000 | February, 10 2013 00:00:00+0000 | May, 12 2013 00:00:00+0000 |
    |         2 | February, 03 2013 00:00:00+0000 |     July, 15 2013 00:00:00+0000 |                     (null) |
    



    1. Where句内のIfステートメント

    2. ORA-00942:schema.tableから選択できますが、tableから選択できませんか?

    3. STRING_AGGでDISTINCT値を生成します

    4. mysqldumpを使用してGEOMETRY列を持つテーブルをバックアップしますか?