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

テーブルをピボットして、n個の順序付けられた時系列を表示します

    これを試してください:

    SELECT r.id,
           r.`date`,
           GROUP_CONCAT(IF(r.device_id = 1,r.`VALUE`,NULL)) AS device_id_1,
           GROUP_CONCAT(IF(r.device_id = 2,r.`VALUE`,NULL)) AS device_id_2
    FROM readings r
    GROUP BY r.`DATE`
    ORDER BY r.`DATE` ASC;
    
    +----+---------------------+-------------+-------------+
    | id | date                | device_id_1 | device_id_2 |
    +----+---------------------+-------------+-------------+
    |  1 | 2015-10-01 10:00:00 | 2           | 0.5         |
    |  3 | 2015-10-01 10:01:00 | 3.1         | 7.5         |
    +----+---------------------+-------------+-------------+
    2 rows in set (0.00 sec)
    

    そしてここに動的device_idのバージョン

    SELECT  group_concat( 
        "GROUP_CONCAT(IF(device_id = ",
        device_id,",`value`,NULL)) AS device_id_",
        device_id
        SEPARATOR ',\n') INTO @sql_mid
    FROM (SELECT DISTINCT device_id FROM readings ORDER BY device_id) AS r
    ORDER BY device_id;
    
    SELECT CONCAT("SELECT id, `date`, ", @sql_mid, " FROM readings GROUP BY `DATE` ORDER BY `DATE` ASC") INTO @sql;
    
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
    

    すべての列を生成します

    +----+---------------------+-------------+-------------+-------------+
    | id | date                | device_id_1 | device_id_2 | device_id_3 |
    +----+---------------------+-------------+-------------+-------------+
    |  1 | 2015-10-01 10:00:00 | 2           | 0.5         | NULL        |
    |  3 | 2015-10-01 10:01:00 | 3.1         | 7.5         | NULL        |
    |  5 | 2015-10-01 10:11:00 | NULL        | NULL        | 9.9         |
    +----+---------------------+-------------+-------------+-------------+
    3 rows in set (0.00 sec)
    



    1. 接続文字列からデフォルトのスキーマを設定できますか?

    2. MySql:Tinyint(2)とtinyint(1)-違いは何ですか?

    3. 個別の値をカウントする

    4. MySQL:サーバーのタイムゾーンまたはユーザーのタイムゾーンを維持しますか?