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