7
votes

manière correcte de créer une table de pivot dans PostgreSQL à l'aide du cas où

J'essaie de créer une vue de type de table pivot dans PostgreSQL et je suis presque là! Voici la requête de base: xxx pré>

et les données: p> xxx pré>

Ce que j'essaie d'obtenir est ce qui suit: p>

ERROR:  function first(character varying) does not exist


1 commentaires

Pourriez-vous poster les résultats de cette requête: Sélectionnez * à partir d'Acc2Tax_node où ACC = 'AJ012531' ?


6 Réponses :


0
votes
SELECT  atn.acc, ts.name AS species, tp.name AS phylum
FROM    acc2tax_node atn
LEFT JOIN
        tax_node ts
ON      ts.taxid = atn.taxid
        AND ts.rank = 'species'
LEFT JOIN
        tax_node tp
ON      tp.taxid = atn.taxid
        AND tp.rank = 'phylum'
WHERE   atn.acc = 'AJ012531 '

0 commentaires

0
votes

Autres informations à la demande (dans une réponse plutôt qu'un commentaire pour Beau formatage):

SELECT * FROM acc2tax_node WHERE acc = 'AJ012531';

   acc    | taxid  
----------+--------
 AJ012531 |  66400
 AJ012531 |  66399
 AJ012531 |  39216
 AJ012531 |  39215
 AJ012531 | 166235
 AJ012531 | 166384
 AJ012531 |   6157
 AJ012531 |  33214
 AJ012531 |  33213
 AJ012531 |   6072
 AJ012531 |  33208
 AJ012531 |  33154
 AJ012531 |   2759
 AJ012531 | 131567


0 commentaires

2
votes

postgreSQL a quelques fonctions pour les requêtes de pivotement, voir cet article sur postgresonline . Vous pouvez trouver ces fonctions dans le PRT .


1 commentaires

Oui, je soupçonne que la bonne façon de le faire est avec Scosstab. J'aimerais toujours comprendre ce que je fais mal ici pour mes propres études.



7
votes

Utilisez max () ou min (), pas d'abord (). Dans ce scénario, vous aurez toutes les nuls dans la colonne par chaque valeur de groupe, sauf pour, au plus, une avec une valeur NON NULL. Par définition, il s'agit à la fois du min et du max de cet ensemble de valeurs (toutes les nulls sont exclus).


1 commentaires

Cela fonctionne parfaitement, merci. Pour une raison quelconque, j'ai supposé que max () ne fonctionnerait pas parce que j'utilisais des valeurs de chaîne.



0
votes

Exécuter:

SELECT report.* FROM crosstab(
 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';
) AS report(species text, enus text, family text, ...)


0 commentaires

1
votes

Comme Matthew Wood a souligné, utilisez min () ou max (), pas d'abord (): xxx


0 commentaires