sql >> Database teknologi >  >> RDS >> Mysql

Vælg dynamiske kolonner i mysql

MySQL har desværre ikke en PIVOT funktion, som dybest set er det, du forsøger at gøre. Så du bliver nødt til at bruge en aggregeret funktion med en CASE erklæring:

SELECT type,
  sum(case when criteria_id = 'env' then result end) env,
  sum(case when criteria_id = 'gas' then result end) gas,
  sum(case when criteria_id = 'age' then result end) age
FROM results
group by type

Se SQL Fiddle with Demo

Hvis du nu vil udføre dette dynamisk, hvilket betyder, at du ikke på forhånd ved, hvilke kolonner der skal transponeres, så bør du gennemgå følgende artikel:

Dynamiske pivottabeller (transformer rækker til kolonner)

Din kode vil se sådan ud:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'SUM(IF(CRITERIA_ID = ''',
      CRITERIA_ID,
      ''', RESULT, NULL)) AS ',
      CRITERIA_ID
    )
  ) INTO @sql
FROM
  Results;
SET @sql = CONCAT('SELECT type, ', @sql, ' FROM Results GROUP BY type');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

Se SQL Fiddle with Demo




  1. Sådan erstattes et regex-mønster i MySQL

  2. Kom godt i gang med Cloud Firestore til iOS

  3. MELLEM klausul versus <=OG>=

  4. @@DATEFIRST – Få ugens første dag i SQL Server