Maison >base de données >tutoriel mysql >Comment faire pivoter les données dans MySQL : transformer des colonnes en lignes ?

Comment faire pivoter les données dans MySQL : transformer des colonnes en lignes ?

Susan Sarandon
Susan Sarandonoriginal
2025-01-09 15:12:39457parcourir

How to Pivot Data in MySQL: Transforming Columns into Rows?

MySQL Pivot : convertir les colonnes en lignes

Dans MySQL, un tableau croisé dynamique doit être généré en convertissant les colonnes en lignes pour une meilleure présentation des données. Par exemple, considérons un tableau contenant plusieurs colonnes (par exemple, col1, col2) représentant les données de différents mois (par exemple, janvier, février).

Exigences : Créez un rapport qui présente les données dans un format de tableau croisé dynamique, où chaque ligne représente une colonne du tableau d'origine et chaque colonne représente un mois différent.

Extension des données :

MySQL ne dispose pas de fonctions intégrées pour déplier les données (conversion de colonnes en lignes). Cependant, cela peut être réalisé avec une requête UNION ALL :

<code class="language-sql">SELECT id, month, col1 AS value, 'col1' AS descrip
FROM yourtable
UNION ALL
SELECT id, month, col2 AS value, 'col2' AS descrip
FROM yourtable
UNION ALL
SELECT id, month, col3 AS value, 'col3' AS descrip
FROM yourtable
UNION ALL
SELECT id, month, col4 AS value, 'col4' AS descrip
FROM yourtable</code>

Résultat :

Cette requête convertit les données au format suivant :

ID MONTH VALUE DESCRIP
101 Jan A col1
101 Jan B col2
101 Jan NULL col3
101 Jan B col4
102 Feb C col1
102 Feb A col2
102 Feb G col3
102 Feb E col4

Pivot :

Une fois les données développées, elles peuvent être converties au format de tableau croisé dynamique souhaité à l'aide de fonctions d'agrégation. La requête suivante utilise une instruction CASE pour regrouper les données par chaque colonne (descrip) et afficher les valeurs de janvier et février :

<code class="language-sql">SELECT descrip,
MAX(CASE WHEN month = 'Jan' THEN value ELSE 0 END) AS Jan,
MAX(CASE WHEN month = 'Feb' THEN value ELSE 0 END) AS Feb
FROM
(
SELECT id, month, col1 AS value, 'col1' AS descrip
FROM yourtable
UNION ALL
SELECT id, month, col2 AS value, 'col2' AS descrip
FROM yourtable
UNION ALL
SELECT id, month, col3 AS value, 'col3' AS descrip
FROM yourtable
UNION ALL
SELECT id, month, col4 AS value, 'col4' AS descrip
FROM yourtable
) src
GROUP BY descrip</code>

Résultat :

Cette requête génère le format de tableau croisé dynamique requis :

DESCRIP JAN FEB
col1 A C
col2 B A
col3 0 G
col4 B 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