J'ai une table (qui résulte d'une requête) à Postgres qui comporte un ensemble de lignes (résultat d'une somme compliquée de données) qui ressemble à ce qui suit: (Les noms de colonne sont les noms de chaque jour et la valeur de chaque colonne est une double précision.) p>
Sun lundi Mer jeudi Jeudi Fri
1.24 1.11 4.51 3.21 2.21 1.01 P>
Je dois avoir les données sélectionnées d'une ligne afin que les résultats ressemblent au ci-dessous: p>
Montant du jour
Soleil 1.24
Lun 1.11
Mardi 4.51
Mer 3.21
Jeudi 2.21
Ven 1.01
P>
J'ai des difficultés à commencer, car j'ai vraiment besoin de changer les noms de colonne en valeurs et pivoter le résultat. J'ai essayé d'expérimenter le crosstab mais je ne suis pas tout à fait sûr que c'est ce dont j'ai besoin. Tout conseil ou suggestions qui pourraient me faire aller dans la bonne direction seraient très appréciés. P>
3 Réponses :
Je ne connais pas la mise en œuvre directe, mais peut-être quelque chose comme Bien sûr, si vous n'avez pas besoin d'une solution flexible que vous n'avez pas besoin peut faire p> (samedi?) p> p>
Objets de test:
create or replace function unpivot(t) returns setof record language plpgsql immutable strict as $$ declare q record; r record; begin for q in ( select attname, attnum from pg_attribute where attnum>0 and attrelid = ( select oid from pg_class where relname = 't' ) ) loop for r in execute 'select '''||q.attname||'''::text, '|| '('||$1::text||'::t).'||q.attname||'::numeric' loop return next r; end loop; end loop; return; end;$$; select * from unpivot((select row(t.*)::t from t)) as foo(day text, amount numeric);
Modification de la première réponse de @jack Douglas: Un peu moins coûteux selon le planificateur de requête 9.0: p> contre p> SEQ Numérisation sur T (Coût = 0,00 ..11.62 lignes = 360 largeur = 192) code> p>
SCAN SUBQUERY sur z (coût = 0,00..12,16 lignes = 360 largeur = 68)
-> SEQ Scan on t (coût = 0,00..11,26 lignes = 360 largeur = 192) code> p> p>
La question connexe est Stackoverflow.com/questions/1128737/unpivot-and-postgresql
Avec "Expérimentation avec Crosstab" I> Vous vous référez au module Croststab Contrib?
Oui, je regardais la fonction de tablefunc.croststab - Postgresql.org/docs/Current /Static/tablefunc.html