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

MySQL-pivottabelforespørgsel med dynamiske kolonner, der afkorter nøgleværdi

Der er flere problemer med din kode - ved at reducere tyngdekraften:

  • du skal vælge from z_tmp_admin_system_settings , ikke from name
  • kolonnen, der skal grupperes efter, kaldes category , ikke subdomain
  • da princippet i forespørgslen er at bruge aggregering, har du brug for en aggregeret funktion for de genererede kolonner, såsom MAX(); gamle versioner af MySQL tolererer ikke at bruge en aggregeret funktion på ikke-aggregerede kolonner, men det er ikke noget man skal vænne sig til
  • det er en god praksis at omgive navnet på kolonnerne med backticks, hvis et af navnene kolliderer med et reserveret ord (dette er ikke tilfældet i dine eksempeldata, men det er sandsynligvis ikke udtømmende)
  • DISTINCT er sandsynligvis ikke nødvendig, medmindre du har duplikeret name s pr. kategori (i dette tilfælde er du velkommen til at tilføje den tilbage til nedenstående kode)
  • Sidebemærkning:IFNULL(..., NULL) er en no-op

Kode:

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. mysqli/mysql-forespørgsel inde i funktionen virker ikke

  2. Importer data til en MySQL-database

  3. Sådan får du den aktuelle dato i PostgreSQL

  4. Oracle SQL find tegn ¡ i data