PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Générer dynamiquement des colonnes dans PostgreSQL

La requête de tableau croisé de base pour votre exemple est simple :

SELECT * FROM crosstab(
       'SELECT zoom, day, point
        FROM   province
        ORDER  BY 1, 2'

     , $$VALUES ('2015-10-01'::date), ('2015-10-02')$$)
AS ct (zoom text, day1 int, day2 int);

Mais pas avec des noms de colonnes dynamiques ou un nombre dynamique de colonnes. En guise de compromis, vous pouvez avoir un nombre fixe de colonnes et ne remplir que les premières. Notions de base :

  • Requête croisée PostgreSQL

Dynamique ?

crosstab_hash ne va pas vous aider avec les noms de colonnes dynamiques. C'est pour une utilisation répétée sans taper une liste de définition de colonne, mais pas pour dynamique noms de colonnes. Exemples :

  • Générer dynamiquement des colonnes pour le tableau croisé dans PostgreSQL
  • Sql :transposer des lignes en colonnes

Pour les noms de colonnes vraiment dynamiques, vous avez besoin de deux allers-retours vers le serveur. Que vous récupériez les noms de colonnes avec une première requête pour construire une deuxième requête, ou que vous créiez un curseur ou une table temporaire ou une instruction préparée. Quoi que vous essayiez, vous avez besoin de deux allers-retours. SQL veut connaître le type de retour au moment de l'appel.

Le plus proche que je puisse obtenir d'un appel "dynamique" est avec mon crosstab_n() personnalisé fonction définie dans cette réponse associée :

  • Alternative dynamique au pivot avec CASE et GROUP BY

Ou vous abandonnez l'idée d'une requête tableau croisé complètement dynamique (parce que, vous savez, c'est impossible) et utilisez un flux de travail en deux étapes, comme mentionné ci-dessus.

  1. Laissez une fonction générer le texte de la requête de tableau croisé. Vous pouvez utiliser la fonction fournie ici (et l'adapter à vos besoins !) :

    • Exécuter une requête tableau croisé dynamique

    En particulier, supprimez GROUP BY 1, 2 , puisque vous n'agrégez pas les lignes avant le tableau croisé.

  2. Exécutez la fonction générée.

Pour être complet, il y a aussi le nouveau \crosstabview métacommande dans psql dans Postgres 9.6 (vient de sortir) - avec des fonctionnalités similaires, et il peut afficher des noms de colonnes dynamiques (l'association de noms dynamiques se produit dans le client psql, pas dans le serveur Postgres).