Maison >base de données >tutoriel mysql >Comment convertir dynamiquement des lignes en colonnes dans MySQL ?

Comment convertir dynamiquement des lignes en colonnes dans MySQL ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-14 11:22:46819parcourir

How to Dynamically Convert Rows to Columns in MySQL?

Requête dynamique de ligne à colonne MySQL

MySQL prend en charge la conversion des données de ligne en données de colonne, permettant ainsi d'ajouter dynamiquement de nouvelles colonnes selon les besoins. Ce processus est souvent associé aux tableaux croisés dynamiques, qui présentent les données dans un format tabulaire plus convivial. Pour réaliser cette conversion, vous pouvez utiliser les fonctions GROUP BY et MAX.

Ce qui suit est un exemple contenant le tableau A et le tableau B :

<code>表 A
+--+-----+----+
|id|order|data|
+--+-----+----+
|1 |1    |P   |
+--+-----+----+
|2 |2    |Q   |
+--+-----+----+
|2 |1    |R   |
+--+-----+----+
|1 |2    |S   |
+--+-----+----+

表 B
+--+----+----+
|id|name|value|
+--+----+----+
|1 |name1|data1|
+--+----+----+
|1 |name2|data2|
+--+----+----+
|2 |name1|data3|
+--+----+----+
|2 |name2|data4|
+--+----+----+</code>

Pour convertir cette structure de données en un tableau avec des lignes et des colonnes, vous pouvez utiliser la requête suivante :

<code class="language-sql">SELECT  ID,
        MAX(IF(`order` = 1, data, NULL)) AS data1,
        MAX(IF(`order` = 2, data, NULL)) AS data2
FROM    TableA
GROUP   BY ID</code>

Le résultat de cette requête sera :

<code>+--+-----+-----+
|id|data1|data2|
+--+-----+-----+
|1 |P    |S    |
+--+-----+-----+
|2 |R    |Q    |
+--+-----+-----+</code>

Comme vous pouvez le voir, chaque ligne du tableau B a été convertie en colonne dans le tableau résultant.

Si vos données contiennent plusieurs valeurs pour le même champ « commande », vous pouvez combiner du SQL dynamique pour gérer la transformation plus efficacement. Cette méthode consiste à générer dynamiquement des requêtes basées sur différentes valeurs du champ "order" :

<code class="language-sql">SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'MAX(IF(`order` = ', `order`, ',data,NULL)) AS data', `order`)
  ) INTO @sql
FROM TableName;

SET @sql = CONCAT('SELECT  ID, ', @sql, ' 
                  FROM    TableName
                  GROUP   BY ID');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;</code>

L'avantage de cette approche SQL dynamique est qu'il n'est pas nécessaire de modifier manuellement la requête à chaque fois qu'une nouvelle valeur est ajoutée au champ "order".

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