Maison > base de données > tutoriel mysql > Comment puis-je faire pivoter dynamiquement les données dans MySQL sans fonction PIVOT native ?

Comment puis-je faire pivoter dynamiquement les données dans MySQL sans fonction PIVOT native ?

Patricia Arquette
Libérer: 2025-01-06 07:24:39
original
908 Les gens l'ont consulté

How can I dynamically pivot data in MySQL without a native PIVOT function?

PIVOTAGE dynamique dans MySQL

Dans notre base de données relationnelle, nous avons une table nommée « Parts » qui contient des informations sur les pièces du produit, y compris leur ID de pièce, type de pièce et ID de produit associé. La structure du tableau ressemble à la suivante :

Parts
--------------------------------------
part_id | part_type | product_id
--------------------------------------
1        | A        | 1
2        | B        | 1
3        | A        | 2
4        | B        | 2
5        | A        | 3
6        | B        | 3
Copier après la connexion

Objectif :

Notre objectif est de construire une requête qui transforme ces données dans un format croisé, ce qui donne un tableau avec une ligne pour chaque ID de produit unique, ainsi que des colonnes représentant les ID de pièce correspondants pour les types « A » et « B ». La table de sortie souhaitée devrait ressembler à ceci :

Product_ID | Part_A_ID | Part _B_ID
----------------------------------------
1           | 1         | 2
2           | 3         | 4
3           | 5         | 6
Copier après la connexion

Solution :

Malheureusement, MySQL ne dispose pas d'une fonction PIVOT native. Cependant, nous pouvons simuler son comportement en utilisant une combinaison de fonctions d'agrégation et d'instructions CASE. Pour créer une version dynamique qui gère plusieurs types de pièces, nous utilisons des instructions préparées :

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

Cette requête construit dynamiquement une instruction SQL basée sur les types de pièces uniques dans la table « Parts ». Il utilise ensuite des instructions préparées pour exécuter l'instruction SQL générée, gérant ainsi efficacement les problèmes de performances potentiels avec des ensembles de résultats volumineux.

Alternative pour une solution statique avec un nombre limité de colonnes :

Si nous avons un nombre limité de types de pièces, nous pouvons utiliser une version statique de la requête :

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

Cette alternative est recommandée lorsque le nombre de types de pièces est fixe et petit.

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