Ich versuche, eine Pivot-Tabelle Typ Ansicht in Postgresql zu erstellen und bin fast da! Hier ist die grundlegende Abfrage:richtige Weise zum Erstellen einer Pivot-Tabelle in Postgresql mit CASE WHEN
select
acc2tax_node.acc, tax_node.name, tax_node.rank
from
tax_node, acc2tax_node
where
tax_node.taxid=acc2tax_node.taxid and acc2tax_node.acc='AJ012531';
Und die Daten:
acc | name | rank
----------+-------------------------+--------------
AJ012531 | Paromalostomum fusculum | species
AJ012531 | Paromalostomum | genus
AJ012531 | Macrostomidae | family
AJ012531 | Macrostomida | order
AJ012531 | Macrostomorpha | no rank
AJ012531 | Turbellaria | class
AJ012531 | Platyhelminthes | phylum
AJ012531 | Acoelomata | no rank
AJ012531 | Bilateria | no rank
AJ012531 | Eumetazoa | no rank
AJ012531 | Metazoa | kingdom
AJ012531 | Fungi/Metazoa group | no rank
AJ012531 | Eukaryota | superkingdom
AJ012531 | cellular organisms | no rank
Was ich versuche zu bekommen, ist die folgende:
acc | species | phylum
AJ012531 | Paromalostomum fusculum | Platyhelminthes
Ich versuche, dies zu tun mit CASE WHEN Ich bin also soweit wie folgt:
select
acc2tax_node.acc,
CASE tax_node.rank WHEN 'species' THEN tax_node.name ELSE NULL END as species,
CASE tax_node.rank WHEN 'phylum' THEN tax_node.name ELSE NULL END as phylum
from
tax_node, acc2tax_node
where
tax_node.taxid=acc2tax_node.taxid and acc2tax_node.acc='AJ012531';
die mir die Ausgabe gibt:
acc | species | phylum
----------+-------------------------+-----------------
AJ012531 | Paromalostomum fusculum |
AJ012531 | |
AJ012531 | |
AJ012531 | |
AJ012531 | |
AJ012531 | |
AJ012531 | | Platyhelminthes
AJ012531 | |
AJ012531 | |
AJ012531 | |
AJ012531 | |
AJ012531 | |
AJ012531 | |
AJ012531 | |
Jetzt an einem gewissen Punkt von acc müssen Gruppe Ich weiß, dass ich, so dass ich versuchen
select
acc2tax_node.acc,
CASE tax_node.rank WHEN 'species' THEN tax_node.name ELSE NULL END as sp,
CASE tax_node.rank WHEN 'phylum' THEN tax_node.name ELSE NULL END as ph
from
tax_node, acc2tax_node
where
tax_node.taxid=acc2tax_node.taxid and acc2tax_node.acc='AJ012531'
group by acc2tax_node.acc;
Aber ich bekomme die gefürchtete
ERROR: column "tax_node.rank" must appear in the GROUP BY clause or be used in an aggregate function
Alle vorherigen Beispiele, die ich finden konnte, verwenden so etwas wie SUM() um die CASE-Anweisungen, also denke ich, dass das die Aggregatfunktion ist. Ich habe mit FIRST() versucht:
select
acc2tax_node.acc,
FIRST(CASE tax_node.rank WHEN 'species' THEN tax_node.name ELSE NULL END) as sp,
FIRST(CASE tax_node.rank WHEN 'phylum' THEN tax_node.name ELSE NULL END) as ph
from tax_node, acc2tax_node where tax_node.taxid=acc2tax_node.taxid and acc2tax_node.acc='AJ012531' group by acc2tax_node.acc;
aber den Fehler:
ERROR: function first(character varying) does not exist
Kann jemand irgendwelche Hinweise anbieten?
Könnten Sie bitte die Ergebnisse dieser Abfrage schreiben: ' SELECT * FROM acc2tax_node WHERE acc = 'AJ012531''? – Quassnoi