PostgreSQL sagt "zurück und sql Tupel Beschreibungen sind unvereinbar"
Habe ich folgende Daten:
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
Dass ich neu organisieren möchten wie:
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
Bitte beachten Sie, dass die Werte in den Spalten HBW, HBO und NHB sind die Summen (sum).
Hier ist das Skript, das ich benutze, um die Ausgabe zu erstellen:
-- 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
);
Wenn ich das Skript bekomme ich diesen Fehler:
ERROR: return and sql tuple descriptions are incompatible.
Ich bin nicht sicher, was das bedeutet und wie man den Fehler korrigieren. Kann jemand bitte lassen Sie mich wissen:
- Was mache ich falsch im script?
- Wird mein script erzeugen Sie die gewünschte Ausgabe?
- Versuchen Sie
"Weight" double precision
aus Kreuztabelle Zeilen-definition. - Es sieht aus wie Ihre "HBW", "HBO", ... Spalten sollte
NUMERIC
, nichtTEXT
. - Igor und Daniel, ich habe versucht, Ihre Lösungen aber der Fehler bleibt !!!!. Ich habe auch bearbeitet das Skript zu reflektieren, die richtigen Feldnamen.
- Am besten wäre es, bieten sich die definition der Tabelle mit Datentypen an, was du mit
\d tbl
impsql
. Vorausgesetztdouble precision
für Ihre Daten-Spalten. Die Anpassung an Ihre tatsächlichen Daten geben ...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies funktioniert für mich auf Postgres 9.3:
Erzeugt die gewünschte Ausgabe. Ich kann nicht eine SQLfiddle, da kann man nicht installieren Sie zusätzliche Module gibt.
Wesentliche änderungen
t
)"value"
double precision
ein.k.ein.float8
)Der rest ist eine Frage von Geschmack und Stil. Ich würde es nicht verwenden
value
als Spaltenname, obwohl, da es ein reserviertes Wort in SQL.Details in diesem Zusammenhang zu beantworten:
PostgreSQL Kreuztabelle Abfrage