PostgreSQL dit “retour et sql tuple descriptions sont incompatibles”
J'ai les données suivantes:
ID CLASS VALUE
1 NHB 700905.7243
1 HBW 164216.1311
1 HBO 700905.7243
2 NHB 146023.3792
2 HBW 89543.2972
2 HBO 82152.072
3 NHB 1409818.328
3 HBW 220430.7922
3 HBO 323512.9391
4 NHB 48711.3814
4 HBW 163385.1575
4 HBO 363352.3441
Que je veux réorganiser comme:
ID HBO HBW NHB
1 700905.7243 164216.1311 700905.7243
2 82152.072 89543.2972 146023.3792
3 323512.9391 220430.7922 1409818.328
4 363352.3441 163385.1575 48711.3814
Veuillez noter que les valeurs dans les colonnes HBW, HBO et NHB totaux (somme).
Voici le script que j'utilise pour créer la sortie:
-- CREATE EXTENSION tablefunc;
SELECT *
FROM CROSSTAB
(
'SELECT _tlfd.id,
_tlfd."class",
_tlfd."value"
FROM public._tlfd
WHERE _tlfd."class" = ''HBW'' or _tlfd."class" = ''HBO'' or _tlfd."class" = ''NHB''
ORDER BY 1,2'
)
AS
(
"class" int,
"HBW" text,
"HBO" text,
"NHB" text,
--"Purpose" varchar,
"value" double precision
);
Quand je lance le script, j'obtiens cette erreur:
ERROR: return and sql tuple descriptions are incompatible.
Je ne suis pas sûr de ce que cela signifie et comment corriger l'erreur. Quelqu'un peut s'il vous plaît laissez-moi savoir:
- Ce que je fais mal dans le script?
- Mon script de produire le résultat désiré?
Essayez de supprimer
Il semble que vos "HBW", "HBO", ... les colonnes doivent être
Igor et Daniel, j'ai essayé vos solutions mais l'erreur reste !!!!. J'ai également modifié le script pour refléter correcte des noms de champ.
Il serait préférable de fournir la définition de la table avec les types de données - ce que vous obtenez avec
"Weight" double precision
de tableau croisé définition de ligne.Il semble que vos "HBW", "HBO", ... les colonnes doivent être
NUMERIC
, pas TEXT
.Igor et Daniel, j'ai essayé vos solutions mais l'erreur reste !!!!. J'ai également modifié le script pour refléter correcte des noms de champ.
Il serait préférable de fournir la définition de la table avec les types de données - ce que vous obtenez avec
\d tbl
dans psql
. En supposant que double precision
pour votre colonnes de données. S'adapter à votre type de données ...OriginalL'auteur user3357558 | 2014-02-26
Vous devez vous connecter pour publier un commentaire.
Cela fonctionne pour moi sur Postgresql 9.3:
Produit le résultat souhaité. Je ne peux pas fournir un SQLfiddle, puisque l'on ne peut installer d'autres modules.
Changements essentiels
t
)"value"
double precision
un.k.un.float8
)Le reste est une question de goût et de style. Je ne voudrais pas utiliser
value
comme nom de colonne, mais, depuis, il est un mot réservé en SQL.Détails dans cette réponse:
PostgreSQL Requête Analyse Croisée
Dollar-la citation est expliqué (plus le lien pour la documentation) dans le lien à la fin de ma réponse.
OriginalL'auteur Erwin Brandstetter