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
Libérer: 2025-01-06 07:56:43
original
596 Les gens l'ont consulté

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

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

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

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

Exemple de sortie :

+------------+----------+----------+
| product_id | part_A_id | part_B_id |
+------------+----------+----------+
| 1          | 1        | 2        |
| 2          | 3        | 4        |
| 3          | 5        | 6        |
+------------+----------+----------+
Copier après la connexion
Copier après la connexion

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

Sortie :

+------------+----------+----------+
| product_id | part_A_id | part_B_id |
+------------+----------+----------+
| 1          | 1        | 2        |
| 2          | 3        | 4        |
| 3          | 5        | 6        |
+------------+----------+----------+
Copier après la connexion
Copier après la connexion

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