Maison >base de données >tutoriel mysql >Comment faire pivoter les données dans MySQL à l'aide de GROUP_CONCAT et gérer les en-têtes de colonnes dynamiques ?

Comment faire pivoter les données dans MySQL à l'aide de GROUP_CONCAT et gérer les en-têtes de colonnes dynamiques ?

Linda Hamilton
Linda Hamiltonoriginal
2025-01-06 09:44:43349parcourir

How to Pivot Data in MySQL Using GROUP_CONCAT and Handle Dynamic Column Headers?

REQUÊTE PIVOT/CROSSTAB MySQL

Dans l'analyse des données, il est souvent nécessaire de transformer les données d'un format vertical vers un format horizontal, appelé sous forme de tableaux croisés ou croisés. Dans MySQL, cela peut être réalisé en utilisant diverses techniques.

Création d'un tableau croisé dynamique

Question 1 : Considérons un tableau contenant les colonnes suivantes : app_id, transaction_id, mobile_no, node_id, customer_attribute et enter_value. La tâche consiste à créer un tableau croisé dynamique regroupé par app_id, transaction_id et mobile_no, avec les valeurs de node_id devenant des en-têtes de colonne et la valeur saisie correspondante étant affichée dans les cellules.

Réponse : Ceci peut être réalisé à l'aide de la fonction GROUP_CONCAT :

SELECT
  app_id,
  transaction_id,
  mobile_no,
  GROUP_CONCAT(CASE WHEN node_id = 1 THEN entered_value ELSE NULL END) AS Q1,
  GROUP_CONCAT(CASE WHEN node_id = 2 THEN entered_value ELSE NULL END) AS Q2,
  GROUP_CONCAT(CASE WHEN node_id = 3 THEN entered_value ELSE NULL END) AS Q3,
  GROUP_CONCAT(CASE WHEN node_id = 4 THEN entered_value ELSE NULL END) AS Q4,
  GROUP_CONCAT(CASE WHEN node_id = 5 THEN entered_value ELSE NULL END) AS Q5
FROM
  trn_user_log
GROUP BY
  app_id,
  transaction_id,
  mobile_no;

En utilisant NAME_CONST

Question 2 : Au lieu d'utiliser user_input1, user_input2, etc. comme en-têtes de colonne, vous souhaitez utiliser les valeurs stockées dans customer_attribute.

Réponse : Cela peut être réalisé en utilisant la fonction NAME_CONST, mais une erreur s'est produite en raison aux arguments incorrects fournis :

SELECT
  app_id,
  transaction_id,
  mobile_no,
  NAME_CONST(customer_attribute, (CASE WHEN node_id = 1 THEN entered_value ELSE NULL END))
FROM
  trn_user_log;

La fonction attend une valeur constante pour le deuxième argument, une modification est donc nécessaire :

SELECT
  app_id,
  transaction_id,
  mobile_no,
  CASE node_id
    WHEN 1 THEN NAME_CONST(customer_attribute, entered_value)
    ELSE NULL
  END AS customer_attribute
FROM
  trn_user_log;

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