J'essaie de créer une vue de type tableau croisé dynamique dans postgresql et suis presque là! Voici la requête de base:façon correcte de créer un tableau croisé dynamique dans postgresql en utilisant 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';
Et les données:
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
Ce que je suis en train de faire est la suivante:
acc | species | phylum
AJ012531 | Paromalostomum fusculum | Platyhelminthes
Je suis en train de le faire avec CASE QUAND , donc j'ai aussi loin que le suivant:
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';
Ce qui me donne la sortie:
acc | species | phylum
----------+-------------------------+-----------------
AJ012531 | Paromalostomum fusculum |
AJ012531 | |
AJ012531 | |
AJ012531 | |
AJ012531 | |
AJ012531 | |
AJ012531 | | Platyhelminthes
AJ012531 | |
AJ012531 | |
AJ012531 | |
AJ012531 | |
AJ012531 | |
AJ012531 | |
AJ012531 | |
Maintenant, je sais que je dois groupe par acc à un moment donné, donc j'essayer
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;
Mais je reçois le
redoutéeERROR: column "tax_node.rank" must appear in the GROUP BY clause or be used in an aggregate function
Tous les exemples précédents que j'ai pu trouver utilisent quelque chose comme SUM() autour des instructions CASE, donc je suppose que c'est la fonction d'agrégat. J'ai essayé d'utiliser 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;
mais obtenir l'erreur:
ERROR: function first(character varying) does not exist
Quelqu'un peut-il offrir des conseils?
Pourriez-vous s'il vous plaît afficher les résultats de cette requête: ' SELECT * FROM acc2tax_node O acc acc = 'AJ012531''? – Quassnoi