sql >> Databasteknik >  >> RDS >> Mysql

mysql pivotfrågeresultat med GROUP BY

PIVOT Det är varken lätt (eller trevligt) att göra. Jag föredrar att använda 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

men IF fungerar även i MySQL:

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

Alternativt kan du använda en JOIN på 20 nivåer :

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


  1. 11 sätt att hitta dubbletter av rader som har en primärnyckel i Oracle

  2. Filtrera efter COUNT(*)?

  3. konvertera Epoch tidsstämpel till sql-server (läsbart format för människor)

  4. Spring Batch ORA-08177:kan inte serialisera åtkomst för denna transaktion vid körning av enstaka jobb, SERIALISERAD isoleringsnivå