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 » :
Bank: name val amount John 1 2000 Peter 1 1999 Peter 2 1854 John 2 1888
Notre objectif est de transformer ce tableau au format suivant :
name amountVal1 amountVal2 John 2000 1888 Peter 1999 1854
Pourquoi un simple CASE QUAND échoue
Une approche naïve utilisant uniquement CASE WHEN
pourrait ressembler à ceci :
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;
Cela produit un résultat incorrect :
name amountVal1 amountVal2 John 2000 0 Peter 1999 0 John 0 1888 Peter 0 1854
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
:
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;
Cette requête produit correctement le tableau croisé dynamique :
name amountVal1 amountVal2 John 2000 1888 Peter 1999 1854
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!