sql >> Databasteknik >  >> RDS >> Mysql

MySQL-pivottabellfråga med dynamiska kolumner som trunkerar nyckelvärdet

Det finns flera problem med din kod - genom att minska gravitationen:

  • du måste välja from z_tmp_admin_system_settings , inte from name
  • kolumnen att gruppera efter kallas category , inte subdomain
  • eftersom principen för frågan är att använda aggregering, behöver du en aggregerad funktion för de genererade kolumnerna, såsom MAX(); gamla versioner av MySQL tål att inte använda en aggregerad funktion på icke-aggregerade kolumner, men det är inte något att vänja sig vid
  • det är en god praxis att omge namnet på kolumnerna med backticks, om ett av namnen krockar med ett reserverat ord (detta är inte fallet i dina exempeldata, men det är förmodligen inte heltäckande)
  • DISTINCT behövs förmodligen inte, om du inte har duplicerat name s per kategori (i det här fallet får du gärna lägga till den i koden nedan)
  • Sidonot:IFNULL(..., NULL) är ett nej

Kod:

SET SESSION group_concat_max_len = 100000;
SET @sql = '';

SELECT GROUP_CONCAT(
    CONCAT('MAX(IF(z_tmp_admin_system_settings.name = ''', name, ''', value, NULL)) AS `', name, '`')
)
INTO @sql
FROM z_tmp_admin_system_settings;
SET @sql = CONCAT(
    'SELECT category, ', 
    @sql, 
    ' FROM z_tmp_admin_system_settings GROUP BY category'
);

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

Demo på DB Fiddle :

| category | 2fa | abc_processing_date | activate_new_approve_person | activate_new_schdule | additional_footer_for_person |
| -------- | --- | ------------------- | --------------------------- | -------------------- | ---------------------------- |
| acme     | 0   | today               | 1                           | 1                    |                              |


  1. PayPal IPN uppdaterar inte MySQL-databas

  2. Följande fråga tar för lång tid att köra. Hur man optimerar det

  3. Vad är nytt i MariaDB 10.6

  4. 7 saker att se upp med i din PostgreSQL-distribution