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 moduletablefunc
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!