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

Query tabella pivot MySQL con colonne dinamiche che troncano il valore della chiave

Ci sono diversi problemi con il tuo codice - diminuendo la gravità:

  • devi selezionare from z_tmp_admin_system_settings , non from name
  • la colonna da raggruppare si chiama category , non subdomain
  • poiché il principio della query consiste nell'utilizzare l'aggregazione, è necessaria una funzione di aggregazione per le colonne generate, come MAX(); le vecchie versioni di MySQL tollerano di non utilizzare una funzione di aggregazione su colonne non aggregate, ma non è qualcosa a cui abituarsi
  • è buona norma racchiudere il nome delle colonne con backtick, nel caso in cui uno dei nomi sia in conflitto con una parola riservata (questo non è il caso nei dati di esempio, ma probabilmente non è completo)
  • DISTINCT probabilmente non è necessario, a meno che tu non abbia duplicato name s per categoria (in questo caso, sentiti libero di aggiungerlo al codice sottostante)
  • Nota a margine:IFNULL(..., NULL) è un no-op

Codice:

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 su DB Fiddle :

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