sql >> Base de Datos >  >> RDS >> Mysql

Consulta de tabla dinámica de MySQL con columnas dinámicas que truncan el valor clave

Hay varios problemas con su código, al disminuir la gravedad:

  • debe seleccionar from z_tmp_admin_system_settings , no from name
  • la columna por la que agrupar se llama category , no subdomain
  • dado que el principio de la consulta es usar la agregación, necesita funciones agregadas para las columnas generadas, como MAX(); Las versiones anteriores de MySQL toleran no usar una función agregada en columnas no agregadas, pero eso no es algo a lo que deba acostumbrarse
  • es una buena práctica rodear el nombre de las columnas con acentos graves, en caso de que uno de los nombres entre en conflicto con una palabra reservada (este no es el caso en sus datos de muestra, pero probablemente no sea completo)
  • DISTINCT probablemente no sea necesario, a menos que haya duplicado name s por categoría (en este caso, no dude en volver a agregarlo al código a continuación)
  • Nota al margen:IFNULL(..., NULL) no es operativo

Código:

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;

Demostración en DB Fiddle :

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