Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL-Pivot-Tabellenabfrage mit dynamischen Spalten, die den Schlüsselwert abschneiden

Es gibt mehrere Probleme mit Ihrem Code - durch Verringern der Schwerkraft:

  • Sie müssen from z_tmp_admin_system_settings auswählen , nicht from name
  • Die Spalte, nach der gruppiert werden soll, heißt category , nicht subdomain
  • Da das Prinzip der Abfrage darin besteht, Aggregation zu verwenden, benötigen Sie Aggregatfunktionen für die generierten Spalten, wie z. B. MAX(); alte MySQL-Versionen tolerieren die Verwendung einer Aggregatfunktion für nicht aggregierte Spalten, aber daran muss man sich nicht gewöhnen
  • Es empfiehlt sich, die Namen der Spalten in Backticks einzuschließen, falls einer der Namen mit einem reservierten Wort kollidiert (dies ist in Ihren Beispieldaten nicht der Fall, aber wahrscheinlich nicht vollständig)
  • DISTINCT wird wahrscheinlich nicht benötigt, es sei denn, Sie haben name dupliziert s pro Kategorie (in diesem Fall können Sie es gerne wieder zum unten stehenden Code hinzufügen)
  • Nebenbemerkung:IFNULL(..., NULL) ist ein no-op

Code:

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

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