Maison >base de données >tutoriel mysql >Comment effectuer des requêtes croisées dynamiques dans MySQL à l'aide de PIVOT ?

Comment effectuer des requêtes croisées dynamiques dans MySQL à l'aide de PIVOT ?

Susan Sarandon
Susan Sarandonoriginal
2025-01-06 09:30:41694parcourir

How to Perform Dynamic Crosstab Queries in MySQL Using PIVOT?

Requête MySQL PIVOT/CROSSTAB

Énoncé du problème :

Une table avec des données représentant les entrées utilisateur pour différents attributs doit être transformée en tableau croisé format, où chaque en-tête de colonne représente un attribut et chaque ligne contient les valeurs d'entrée utilisateur correspondantes pour cet attribut. De plus, la valeur de la colonne customer_attribute doit être utilisée comme en-têtes de colonne au lieu d'étiquettes statiques.

Requête 1 : Transformation des données au format Crosstab

Pour obtenir le format Crosstab souhaité, vous pouvez utiliser un Requête PIVOT comme suit :

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'MAX(CASE node_id when ',
      node_id,
      ' then entered_value else NULL END) AS user_input',
      node_id
    )
  ) INTO @sql
FROM trn_user_log;


SET @sql = CONCAT('SELECT app_id, transaction_id, mobile_no, ', @sql, ' 
                  FROM trn_user_log 
                  GROUP BY app_id, transaction_id, mobile_no');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

Cette requête utilise l'opérateur PIVOT pour transformer les lignes en colonnes, regroupées par app_id, colonnes transaction_id et mobile_no.

Requête 2 : utilisation d'en-têtes de colonne personnalisés

Pour utiliser les valeurs de la colonne customer_attribute comme en-têtes de colonne, vous pouvez modifier légèrement la requête ci-dessus :

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'MAX(CASE node_id when ',
      node_id,
      ' then entered_value else NULL END) AS ',
      customer_attribute
    )
  ) INTO @sql
FROM trn_user_log;

SET @sql = CONCAT('SELECT app_id, transaction_id, mobile_no, ', @sql, ' 
                  FROM trn_user_log 
                  GROUP BY app_id, transaction_id, mobile_no');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

Cette requête révisée remplace les en-têtes de colonnes statiques (user_input1, user_input2, etc.) par l'attribut customer_attribute correspondant. valeurs.

Remarque :

  • Les instructions préparées utilisées dans ces requêtes garantissent la création dynamique de colonnes et évitent les erreurs de syntaxe potentielles lors de la gestion d'un nombre inconnu de colonnes.
  • Les La fonction NAME_CONST utilisée dans votre requête initiale n'est pas applicable dans ce cas, car elle nécessite une valeur constante comme deuxième argument, ce qui n'est pas réalisable pour la génération de colonnes dynamiques.

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