Maison >base de données >tutoriel mysql >Comment puis-je transposer les données d'une table SQL avec des noms de colonnes générés dynamiquement et définis par l'utilisateur ?

Comment puis-je transposer les données d'une table SQL avec des noms de colonnes générés dynamiquement et définis par l'utilisateur ?

DDD
DDDoriginal
2025-01-05 21:40:41645parcourir

How Can I Transpose SQL Table Data with Dynamically Generated User-Defined Column Names?

Transposer des données de table SQL avec des noms de champs définis par l'utilisateur

Le pivotement des données, ou leur transposition, implique la transformation d'une table où les colonnes représentent des attributs et les lignes représentent les données d'entité dans un tableau où les lignes représentent les attributs et les colonnes représentent les données d'entité. Ceci est souvent utile lorsque vous travaillez avec des noms de champs définis par l'utilisateur, comme le montre l'exemple de table fourni.

Requête de table transposée

Pour transposer la table donnée, vous peut utiliser une combinaison de fonctions SQL et d'instructions conditionnelles, comme indiqué ci-dessous :

SELECT t.UserId,
       MAX(CASE WHEN t.FieldName = 'Username' THEN t.FieldValue ELSE NULL END) AS Username,
       MAX(CASE WHEN t.FieldName = 'Password' THEN t.FieldValue ELSE NULL END) AS Password,
       MAX(CASE WHEN t.FieldName = 'Email Address' THEN t.FieldValue ELSE NULL END) AS Email
FROM t
GROUP BY t.UserId

Explication

  • La fonction MAX renvoie la valeur maximale pour chaque colonne, qui correspond à la valeur du champ pour le nom de champ spécifique.
  • L'instruction CASE évalue la colonne FieldName et renvoie la FieldValue correspondante pour chaque nom de champ qui apparaît dans le WHERE
  • La clause GROUP BY regroupe les résultats par UserId, garantissant que les données de chaque utilisateur sont placées dans une ligne distincte.

Requête dynamique avec instructions préparées

Pour gérer une liste dynamique de noms de champs, vous pouvez utiliser l'instruction préparée de MySQL (SQL dynamique) syntaxe :

SET @sql = 'SELECT UserId, ';
SELECT GROUP_CONCAT(CONCAT('MAX(CASE WHEN FieldName = ''', FieldName, ''' THEN FieldValue ELSE NULL END) AS ', FieldName)) INTO @sql FROM (SELECT DISTINCT FieldName FROM t);
SET @sql = CONCAT(@sql, ' FROM t GROUP BY UserId');
PREPARE stmt FROM @sql;
EXECUTE stmt;

Cette requête crée dynamiquement une instruction SQL basée sur les noms de champs distincts de la table et l'exécute à l'aide d'une instruction préparée.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn