CASE
et GROUP BY
contre la fonction crosstab
Dans PostgreSQL, de nombreux utilisateurs doivent convertir les tableaux de données de lignes en tableaux de données de colonnes à des fins d'analyse et de reporting. Bien que CASE
et GROUP BY
soient des méthodes couramment utilisées, des alternatives plus dynamiques et efficaces existent.
Par exemple, considérons le tableau suivant :
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 |
Sortie souhaitée Convertissez ces données au format suivant :
bar | val1 | val2 | val3 |
---|---|---|---|
A | 10 | 20 | NULL |
B | 3 | 4 | NULL |
C | 5 | NULL | NULL |
D | 6 | 7 | 8 |
CASE
et GROUP BY
Une façon d'y parvenir est d'utiliser les techniques CASE
et GROUP BY
:
<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>
Bien que cette approche fonctionne, elle présente des limites potentielles en termes de flexibilité et de performances.
crosstab
Fonctions : une solution dynamique introduite par le module tablefunc
dans PostgreSQL est une alternative plus dynamique et efficace. En utilisant la fonction crosstab()
, vous pouvez réaliser la transformation souhaitée sans définir explicitement les colonnes de sortie. crosstab()
crosstab
solution de base est la suivante : crosstab
<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>
fournit des données dans un format compatible avec SELECT bar, 1 AS cat, feh
. La colonne crosstab()
est utilisée comme espace réservé factice car il n'y a aucune information de catégorie dans le tableau. cat
crosstab
<code class="language-sql">SELECT * FROM crosstab( $$ SELECT bar, val, feh FROM ( SELECT *, 'val' || row_number() OVER (PARTITION BY bar ORDER BY feh) AS val FROM tbl_org ) x ORDER BY 1, 2 $$ , $$VALUES ('val1'), ('val2'), ('val3')$$ ) AS ct (bar text, val1 int, val2 int, val3 int);</code>
crosstab
. tablefunc
offre une alternative puissante et dynamique aux méthodes crosstab()
et CASE
. Il permet une transformation flexible des données, ce qui en fait un outil précieux pour la manipulation des données dans PostgreSQL. GROUP BY
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!