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
763 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 :

<code class="language-sql">CREATE EXTENSION tablefunc;</code>
Copier après la connexion

Solution de base de tableau croisé :

Solution crosstab simple pour ce scénario :

<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

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 :

<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

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 :

<code class="language-sql">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);</code>
Copier après la connexion

module tablefunc :

Le module

tablefunc propose une approche simplifiée :

<code class="language-sql">SELECT * FROM crosstab1('SELECT row_name, attrib, val::text FROM tbl ORDER BY 1,2');</code>
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!

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