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
Libérer: 2025-01-06 09:30:41
original
652 Les gens l'ont consulté

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;
Copier après la connexion

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;
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal