Próbuję utworzyć widok typu tabela przestawna w postgresql i jestem prawie tam! Oto podstawowego zapytania:poprawny sposób tworzenia tabeli przestawnej w postgresql przy użyciu 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';
a dane:
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
Próbuję dostać się następująco:
acc | species | phylum
AJ012531 | Paromalostomum fusculum | Platyhelminthes
Staram się robić to z przypadku, gdy , więc mam aż o:
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';
Który daje mi wynik:
acc | species | phylum
----------+-------------------------+-----------------
AJ012531 | Paromalostomum fusculum |
AJ012531 | |
AJ012531 | |
AJ012531 | |
AJ012531 | |
AJ012531 | |
AJ012531 | | Platyhelminthes
AJ012531 | |
AJ012531 | |
AJ012531 | |
AJ012531 | |
AJ012531 | |
AJ012531 | |
AJ012531 | |
Teraz wiem, że mam do grupy przez acc w pewnym momencie, więc staram
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;
Ale pojawia się bał
ERROR: column "tax_node.rank" must appear in the GROUP BY clause or be used in an aggregate function
Wszystkie poprzednie przykłady, które udało mi się znaleźć, używają czegoś takiego jak SUM() wokół instrukcji CASE, więc domyślam się, że jest to funkcja agregująca. Próbowałem przy użyciu FIRST():
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;
ale pojawia się błąd:
ERROR: function first(character varying) does not exist
Może ktoś oferują żadnych wskazówek?
mógłbyś dodawać wyniki tej kwerendy: ' SELECT * FROM acc2tax_node WHERE acc = 'AJ012531''? – Quassnoi