Estoy tratando de crear una vista de tabla dinámica en postgresql y estoy a punto de hacerlo. Ésta es la consulta básica:manera correcta de crear una tabla dinámica en postgresql usando CASE CUANDO
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';
Y los datos:
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
Lo que estoy tratando de conseguir es la siguiente:
acc | species | phylum
AJ012531 | Paromalostomum fusculum | Platyhelminthes
que estoy tratando de hacer esto con CASO CUANDO , así que tengo hasta lo siguiente:
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';
Lo que me da la salida:
acc | species | phylum
----------+-------------------------+-----------------
AJ012531 | Paromalostomum fusculum |
AJ012531 | |
AJ012531 | |
AJ012531 | |
AJ012531 | |
AJ012531 | |
AJ012531 | | Platyhelminthes
AJ012531 | |
AJ012531 | |
AJ012531 | |
AJ012531 | |
AJ012531 | |
AJ012531 | |
AJ012531 | |
Ahora sé que tengo al grupo por el CAC en algún momento, así que trato
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;
pero tengo la temida
ERROR: column "tax_node.rank" must appear in the GROUP BY clause or be used in an aggregate function
Todos los ejemplos anteriores que he podido encontrar usan algo como SUM() alrededor de las sentencias CASE, así que supongo que esa es la función agregada. He intentado usar primero():
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;
pero obtener el error:
ERROR: function first(character varying) does not exist
¿Alguien puede ofrecer alguna pista?
Podría por favor, puesto los resultados de esta consulta: ' SELECCIONAR * DESDE acc2tax_node DONDE acc = 'AJ012531''? – Quassnoi