Maison >base de données >tutoriel mysql >Comment faire pivoter dynamiquement des lignes vers des colonnes dans MySQL en fonction de plusieurs critères ?

Comment faire pivoter dynamiquement des lignes vers des colonnes dans MySQL en fonction de plusieurs critères ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-05 12:44:42979parcourir

How to Dynamically Pivot Rows to Columns in MySQL Based on Multiple Criteria?

Conversion dynamique de lignes en colonnes avec plusieurs critères dans MySQL

Question :

Comment peut-on Je convertis dynamiquement des lignes en colonnes dans MySQL en fonction de deux critères, représentés par deux colonnes ?

Contexte :

Un tableau contient plusieurs lignes avec des colonnes nommées « données » et « prix » pour chaque ligne. L'objectif est de transformer le tableau en un nouveau tableau avec des colonnes représentant des combinaisons uniques de données et de prix, et chaque cellule contenant les données de ligne correspondantes.

Solution :

Pour convertir dynamiquement des lignes en colonnes en fonction de plusieurs critères, nous pouvons utiliser une combinaison de fonctions MySQL et de SQL dynamique.

  1. Unpivot Données :

Tout d'abord, nous annulons le pivotement du tableau d'origine pour créer un nouveau tableau avec plusieurs lignes pour chaque combinaison unique de données et de prix.

SELECT id, CONCAT('order', `order`) AS col, data AS value
FROM tableA
UNION ALL
SELECT id, CONCAT('item', item) AS col, price AS value
FROM tableA;
  1. Données pivot :

Ensuite, nous regroupons les données non pivotées en colonnes en utilisant l'instruction CASE.

SELECT id, 
MAX(CASE WHEN col = 'order1' THEN value END) AS order1,
MAX(CASE WHEN col = 'order2' THEN value END) AS order2,
MAX(CASE WHEN col = 'order3' THEN value END) AS order3,
MAX(CASE WHEN col = 'item1' THEN value END) AS item1,
MAX(CASE WHEN col = 'item2' THEN value END) AS item2,
MAX(CASE WHEN col = 'item3' THEN value END) AS item3
FROM (
  SELECT id, CONCAT('order', `order`) AS col, data AS value
  FROM tableA
  UNION ALL
  SELECT id, CONCAT('item', item) AS col, price AS value
  FROM tableA
) d
GROUP BY id;
  1. SQL dynamique :

Pour rendre la requête dynamique, nous utilisons des instructions préparées et générons dynamiquement les instructions CASE basé sur les colonnes uniques de la table d'origine.

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'MAX(CASE WHEN col = ''',
      col,
      ''' THEN value END) AS `', 
      col, '`')
  ) INTO @sql
FROM (
  SELECT CONCAT('order', `order`) AS col
  FROM tableA
  UNION ALL
  SELECT CONCAT('item', `item`) AS col
  FROM tableA
) d;

SET @sql = CONCAT('SELECT id, ', @sql, ' 
                  FROM (
                    SELECT id, CONCAT(''order'', `order`) AS col,  data AS value
                    FROM tableA
                    UNION ALL
                    SELECT id, CONCAT(''item'', item) AS col, price AS value
                    FROM tableA
                  ) d
                  GROUP BY id');

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

Cette requête dynamique gère un nombre arbitraire de critères uniques et produit le résultat souhaité. table transformé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