2017-05-16 1 views
0

J'ai une table comme la suivante:Postgres tableau croisé dynamique avec crosstab

date   value 1  value 2 value 3 
---------------------------------------------------- 
    01/01/2017 263   7   222 
    02/01/2017 275   -9   209 
    03/01/2017 331   -9   243 
     . 
     . 
     . 

Je veux créer cet autre dans Postgres:

  01/01/2017 02/01/2017 03/01/2017 
value 1  263   275   331 
value 2  7    -9   -9 
value 3  222   209   243 

Mais mon problème est que je ne sais pas comment beaucoup de dates je vais avoir, donc je dois utiliser quelque chose comme ceci:

SELECT * FROM crosstab(
    $$ SELECT value1, date FROM myTable ORDER BY 1 $$, 
    $$ SELECT m FROM generate_series((select min(date) from myTable) ,(select max(date) from myTable), '1 month'::interval) m $$ 
) AS (
    ".." date, ".." date, ".." date, ".." date 
); 

Quelqu'un peut-il m'aider? Merci.

+0

'Je ne sais pas combien de dates j'aurai ', Donc, si vous avez dit 1000 dates, alors vous attendez 1000 colonnes dans le résultat? –

+0

Oui, mais je n'aurai jamais 1000 colonnes, car le nombre maximum de dates sera de 12, une pour chaque mois de l'année. Dans l'exemple, 'dateformat' sera mm/jj/aaaa. – dbz

Répondre

0

Votre problème de base est que PostgreSQL doit savoir à quoi ressemblent les colonnes pour planifier la requête. Par conséquent, vous devez renvoyer une sorte de structure à colonne fixe. Il y a un certain nombre de manières que vous pouvez faire ceci:

  1. Commencez par interroger les dates ou laissez-les entrer, puis générez votre requête dans le client db. Renvoyer ceci dans une procédure stockée qui renvoie un refcursor
  2. Retourne dans une procédure stockée qui renvoie une liste de représentations JSON de lignes.

Mais de toute façon vous ne pouvez pas le faire dans une requête sans générer dynamiquement la requête quelque part.