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
Linda Hamiltonoriginal
2025-01-20 22:51:09827parcourir

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>

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>

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>

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>

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>

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