Maison >base de données >tutoriel mysql >Comment faire pivoter une colonne dans SQL en utilisant CASE WHEN et SUM() ?

Comment faire pivoter une colonne dans SQL en utilisant CASE WHEN et SUM() ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-11 15:51:46645parcourir

How to Pivot a Column in SQL Using CASE WHEN and SUM()?

Utiliser CASE WHEN et SUM() pour faire pivoter une colonne en SQL

La transformation des données nécessite souvent de remodeler les tableaux, de déplacer les données des lignes vers les colonnes, un processus appelé pivotement. Cet exemple montre comment faire pivoter une colonne en SQL en utilisant CASE WHEN et SUM().

Considérons un exemple de table nommée « Banque » :

<code class="language-sql">Bank:
name  val   amount
John   1     2000
Peter  1     1999
Peter  2     1854
John   2     1888</code>

Notre objectif est de transformer ce tableau au format suivant :

<code class="language-sql">name  amountVal1 amountVal2
John    2000        1888
Peter   1999        1854</code>

Pourquoi un simple CASE QUAND échoue

Une approche naïve utilisant uniquement CASE WHEN pourrait ressembler à ceci :

<code class="language-sql">SELECT name,
CASE WHEN val = 1 THEN amount ELSE 0 END AS amountVal1,
CASE WHEN val = 2 THEN amount ELSE 0 END AS amountVal2
FROM bank;</code>

Cela produit un résultat incorrect :

<code class="language-sql">name  amountVal1 amountVal2
John    2000        0
Peter   1999        0
John    0          1888
Peter   0          1854</code>

Le problème est que chaque ligne est traitée indépendamment. Nous devons agréger les résultats.

La bonne solution avec SUM()

La solution réside dans l'utilisation de la fonction d'agrégation SUM() pour additionner les valeurs amount pour chaque combinaison name et val :

<code class="language-sql">SELECT 
  name,
  SUM(CASE WHEN val = 1 THEN amount ELSE 0 END) AS amountVal1,
  SUM(CASE WHEN val = 2 THEN amount ELSE 0 END) AS amountVal2
FROM bank
GROUP BY name;</code>

Cette requête produit correctement le tableau croisé dynamique :

<code class="language-sql">name  amountVal1 amountVal2
John    2000        1888
Peter   1999        1854</code>

La clause GROUP BY name garantit que la fonction SUM() agrège les montants pour chaque nom unique. Les instructions CASE WHEN attribuent conditionnellement des montants aux colonnes appropriées (amountVal1 et amountVal2), traitant les cas où un val particulier est absent pour un nom donné en utilisant 0 comme valeur par défaut. Cette technique fournit un moyen concis et efficace d'effectuer le pivotement de colonnes en SQL.

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