mysql pivot query results with GROUP BY

前端 未结 2 1922
我在风中等你
我在风中等你 2020-11-27 22:27

I have a table to data that I want to export to a CSV. Ideally, I\'d like to switch the rows and columns around, so that the data is grouped a little better.

To expl

相关标签:
2条回答
  • 2020-11-27 22:38

    PIVOTing is neither easy (nor nice) to do. I prefer using CASE:

    SELECT d.data_timestamp
         , SUM( CASE WHEN data_id =  1 THEN data_value ELSE 0 END ) AS 'input_1'
         , SUM( CASE WHEN data_id =  2 THEN data_value ELSE 0 END ) AS 'input_2'
         ...
         , SUM( CASE WHEN data_id = 20 THEN data_value ELSE 0 END ) AS 'input_20'
    FROM data 
    GROUP BY data_timestamp
    ORDER BY data_timestamp ASC
    

    but IF works in MySQL as well:

    SELECT d.data_timestamp
         , SUM( IF(data_id =  1, data_value, 0) ) AS 'input_1'
         , SUM( IF(data_id =  2, data_value, 0) ) AS 'input_2'
         ...
         , SUM( IF(data_id = 20, data_value, 0) ) AS 'input_20'
    FROM data 
    GROUP BY data_timestamp
    ORDER BY data_timestamp ASC
    

    Alternatively, you can use a 20-level JOIN:

    SELECT d.data_timestamp
         , d01.data_value AS 'input_1'
         , d02.data_value AS 'input_2'
         ...
         , d20.data_value AS 'input_20'
    FROM
      ( SELECT DISTINCT d.data_timestamp
        FROM data
      ) AS d 
      LEFT JOIN data AS d01
        ON d01.data_timestamp = d.data_timestamp
        AND d01.data_id =  1
      LEFT JOIN data AS d02
        ON d02.data_timestamp = d.data_timestamp
        AND d02.data_id =  2
      ...                                   --- 20 JOINs
      LEFT JOIN data AS d20
        ON d20.data_timestamp = d.data_timestamp
        AND d20.data_id = 20
    ORDER BY d.data_timestamp ASC
    
    0 讨论(0)
  • 2020-11-27 22:46

    Just join the table to itself!

    SELECT dt1.data_timestamp, dt1.input_1, dt2.input_2
    FROM data_timestamp dt1
    JOIN data_timestamp dt2 
        on dt1.data_timestamp = dt2.data_timestamp 
        and dt2.input_1 is null
    WHERE dt1.input_2 is null;
    

    Note that this query assumes input_2's value are present for every input_1 value. If that's not that case, use LEFT JOIN or CROSS JOIN etc

    0 讨论(0)
提交回复
热议问题