Maison >base de données >tutoriel mysql >Comment faire pivoter dynamiquement des données dans MySQL à l'aide d'instructions préparées ?

Comment faire pivoter dynamiquement des données dans MySQL à l'aide d'instructions préparées ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-06 07:36:40661parcourir

How to Dynamically Pivot Data in MySQL Using Prepared Statements?

Pivotement dynamique dans MySQL à l'aide d'instructions préparées

MySQL ne dispose pas d'une fonction PIVOT native, mais vous pouvez l'émuler à l'aide de fonctions d'agrégation et d'instructions CASE. Pour les données pivotantes dynamiquement, les instructions préparées offrent une solution efficace.

Considérons un scénario avec un tableau des pièces du produit :

CREATE TABLE Parts (
    part_id INT,
    part_type VARCHAR(1),
    product_id INT
);
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);

Le résultat souhaité est un tableau croisé dynamique résumant les ID de pièces pour chacune produit :

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

Pivoté dynamique Requête

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;

Requête pivotée statique (colonnes limitées)

Pour une requête statique avec un nombre fixe de colonnes pivot :

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;

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