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
Libérer: 2025-01-11 15:51:46
original
647 Les gens l'ont consulté

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

Notre objectif est de transformer ce tableau au format suivant :

<code class="language-sql">name  amountVal1 amountVal2
John    2000        1888
Peter   1999        1854</code>
Copier après la connexion
Copier après la connexion

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

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

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

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

<code class="language-sql">name  amountVal1 amountVal2
John    2000        1888
Peter   1999        1854</code>
Copier après la connexion
Copier après la connexion

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!

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