Maison > base de données > tutoriel mysql > Comment puis-je transformer dynamiquement des données orientées lignes en données orientées colonnes dans PostgreSQL ?

Comment puis-je transformer dynamiquement des données orientées lignes en données orientées colonnes dans PostgreSQL ?

Patricia Arquette
Libérer: 2025-01-20 22:38:13
original
765 Les gens l'ont consulté

How Can I Dynamically Transform Row-Oriented Data into Column-Oriented Data in PostgreSQL?

Alternatives pour convertir dynamiquement les données de ligne en données de colonne dans PostgreSQL : 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.

Énoncé du problème

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

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

Bien que cette approche fonctionne, elle présente des limites potentielles en termes de flexibilité et de performances.

crosstabFonctions : une solution dynamique

La fonction

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()

Solution

de basecrosstab

Pour l'exemple de problème, la

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>
Copier après la connexion
Dans cette requête,

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

Solutions

avancéescrosstab

Si une colonne de catégorie réelle est présente, vous pouvez l'utiliser pour contrôler l'ordre des valeurs dans les résultats. La requête suivante le démontre :

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

crosstab

Bien que la solution ci-dessus fournisse la génération dynamique de colonnes, le renvoi dynamique de différentes colonnes dans PostgreSQL est plus difficile. Cependant, sous certaines restrictions, cela peut être réalisé en utilisant la fonctionnalité intégrée du module

. tablefunc

Conclusion

La fonction

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!

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