Maison >base de données >tutoriel mysql >Comment faire pivoter dynamiquement des données dans MySQL à l'aide de fonctions d'agrégation et d'instructions CASE ?

Comment faire pivoter dynamiquement des données dans MySQL à l'aide de fonctions d'agrégation et d'instructions CASE ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-06 07:56:43603parcourir

How to Dynamically Pivot Data in MySQL Using Aggregate Functions and CASE Statements?

Pivoter les données de manière dynamique avec les fonctions d'agrégation et l'instruction CASE de MySQL

Considérez un tableau de pièces de produit avec le schéma suivant :

CREATE TABLE Parts (
    part_id INT NOT NULL,
    part_type CHAR(1) NOT NULL,
    product_id INT NOT NULL,
    PRIMARY KEY (part_id)
);

Échantillon Données :

INSERT INTO Parts (part_id, part_type, product_id) VALUES
(1, 'A', 1),
(2, 'B', 1),
(3, 'A', 2),
(4, 'B', 2),
(5, 'A', 3),
(6, 'B', 3);

L'objectif est de faire pivoter ces données dans un tableau qui représente les parties du produit sous forme de colonnes :

CREATE TABLE PivotedParts (
    product_id INT NOT NULL,
    part_A_id INT,
    part_B_id INT,
    PRIMARY KEY (product_id)
);

Solution de pivotement dynamique :

MySQL n'a pas de fonction PIVOT intégrée, mais une solution dynamique peut être obtenue à l'aide de fonctions d'agrégation et d'un CASE déclaration :

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(case when part_type = ''',
      part_type,
      ''' then part_id end) AS part_',
      part_type, '_id'
    )
  ) INTO @sql
FROM
  Parts;

SET @sql = CONCAT('SELECT product_id, ', @sql, ' 
                  FROM Parts 
                   GROUP BY product_id');

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

Exemple de sortie :

+------------+----------+----------+
| product_id | part_A_id | part_B_id |
+------------+----------+----------+
| 1          | 1        | 2        |
| 2          | 3        | 4        |
| 3          | 5        | 6        |
+------------+----------+----------+

Solution de pivotement statique (pour un nombre limité de colonnes) :

Pour une solution de pivotement statique avec un nombre limité de colonnes, la requête suivante peut être utilisé :

SELECT product_id,
  max(case when part_type ='A' then part_id end) as part_A_id,
  max(case when part_type ='B' then part_id end) as part_B_id
FROM Parts
GROUP BY product_id;

Sortie :

+------------+----------+----------+
| product_id | part_A_id | part_B_id |
+------------+----------+----------+
| 1          | 1        | 2        |
| 2          | 3        | 4        |
| 3          | 5        | 6        |
+------------+----------+----------+

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