Utilisez CASE et GROUP BY pour remplacer dynamiquement PIVOT
Question :
Les données présentées dans le tableau ci-dessous sont organisées en lignes et en colonnes. L'objectif est de convertir cela en un tableau avec un nombre dynamique de colonnes, où chaque colonne représente une valeur regroupée par une catégorie spécifiée.
id | feh | bar |
---|---|---|
1 | 10 | A |
2 | 20 | A |
3 | 3 | B |
4 | 4 | B |
5 | 5 | C |
6 | 6 | D |
7 | 7 | D |
8 | 8 | D |
Résultat attendu :
bar | val1 | val2 | val3 |
---|---|---|---|
A | 10 | 20 | |
B | 3 | 4 | |
C | 5 | ||
D | 6 | 7 | 8 |
Requête originale :
La requête suivante utilise les expressions CASE et GROUP BY pour obtenir les résultats souhaités :
<code class="language-sql">SELECT bar, MAX(CASE WHEN abc."row" = 1 THEN feh ELSE NULL END) AS "val1", MAX(CASE WHEN abc."row" = 2 THEN feh ELSE NULL END) AS "val2", MAX(CASE WHEN abc."row" = 3 THEN feh ELSE NULL END) AS "val3" FROM ( SELECT bar, feh, row_number() OVER (partition by bar) as row FROM "Foo" ) abc GROUP BY bar </code>
Alternative efficace au tableau croisé :
Pour améliorer l'efficacité et la lisibilité, vous pouvez utiliser la fonction crosstab du module tablefunc pour implémenter une solution dynamique. Voici un exemple :
<code class="language-sql">SELECT * FROM crosstab( 'SELECT bar, 1 AS cat, feh FROM tbl_org ORDER BY bar, feh') AS ct (bar text, val1 int, val2 int, val3 int); -- 更多列?</code>
Gestion de plusieurs valeurs :
Pour les scénarios où il y a plusieurs valeurs sous la même catégorie, la fonction de tableau croisé peut être étendue sous la forme suivante :
<code class="language-sql">SELECT * FROM crosstab( 'SELECT bar, val, feh FROM tbl_org ORDER BY 1, 2') AS ct (bar text, val1 int, val2 int, val3 int); -- 更多列?</code>
Fonction de tableau croisé intégrée :
Le module tablefunc fournit également des fonctions de tableau croisé prédéfinies pour un nombre spécifique de colonnes :
<code class="language-sql">SELECT * FROM crosstab3('SELECT row_name, attrib, val FROM tbl ORDER BY 1,2');</code>
Ces fonctions simplifient les appels et gèrent les données texte par défaut.
Type de retour dynamique :
Bien que tablefunc simplifie le processus, il présente des limites dans la gestion des types de retour dynamiques. Pour résoudre ce problème, d'autres méthodes peuvent être envisagées, comme l'utilisation de fonctions PL/pgSQL ou la création d'instructions SQL dynamiques.
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!