Maison > base de données > tutoriel mysql > Comment puis-je créer efficacement des tableaux croisés dynamiques dans PostgreSQL à l'aide de « crosstab() » ?

Comment puis-je créer efficacement des tableaux croisés dynamiques dans PostgreSQL à l'aide de « crosstab() » ?

Linda Hamilton
Libérer: 2025-01-20 22:51:09
original
862 Les gens l'ont consulté

How Can I Efficiently Create Dynamic Pivot Tables in PostgreSQL Using `crosstab()`?

Un moyen plus efficace d'implémenter des tableaux croisés dynamiques à l'aide des instructions CASE et GROUP BY

Par rapport à la requête fournie dans l'article, l'utilisation de la fonction tablefunc dans l'extension crosstab() est une alternative plus efficace.

Installation :

Tout d’abord, installez l’extension tablefunc si ce n’est pas déjà fait :

CREATE EXTENSION tablefunc;
Copier après la connexion

Solution de base de tableau croisé :

Solution crosstab simple pour ce scénario :

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

Colonne de catégorie synthétique :

Si vous n'avez pas de colonne de catégorie réelle, vous pouvez utiliser les fonctions de fenêtre pour créer une colonne de catégorie synthétique :

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

Tableau croisé dynamique ?

Bien que créer un crosstab entièrement dynamique à l'aide de plpgsql soit un défi en raison des limitations des types de retour dynamiques. Voici un exemple de cas de test plus simple :

SELECT * FROM crosstab('SELECT row_name, attrib, val FROM tbl ORDER BY 1,2')
AS ct (row_name text, val1 int, val2 int, val3 int);
Copier après la connexion

module tablefunc :

Le module

tablefunc propose une approche simplifiée :

SELECT * FROM crosstab1('SELECT row_name, attrib, val::text FROM tbl ORDER BY 1,2');
Copier après la connexion

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!

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal