Ich benutze PostgreSQL über das Ruby Gem 'Sequel'.
Ich versuche auf zwei Dezimalstellen zu runden.
Hier ist mein Code:
SELECT ROUND(AVG(some_column),2)
FROM table
Ich erhalte folgende Fehlermeldung:
PG::Error: ERROR: function round(double precision, integer) does
not exist (Sequel::DatabaseError)
Ich erhalte keine Fehlermeldung, wenn ich den folgenden Code ausführe:
SELECT ROUND(AVG(some_column))
FROM table
Weiß jemand was ich falsch mache?
sql
ruby
postgresql
sequel
user1626730
quelle
quelle
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
Antworten:
PostgreSQL definiert nicht
round(double precision, integer)
. Aus Gründen, die @Mike Sherrill 'Cat Recall' in den Kommentaren erklärt, ist die Version der Runde, die eine Präzision benötigt, nur für verfügbarnumeric
.(Beachten Sie oben, dass dies
float8
nur ein Kurzalias für istdouble precision
. Sie können sehen, dass PostgreSQL ihn in der Ausgabe erweitert.)Sie müssen den zu rundenden Wert umwandeln
numeric
, um die Zwei-Argument-Form von zu verwendenround
. Fügen Sie einfach::numeric
die Kurzform hinzuround(val::numeric,2)
.Wenn Sie die Anzeige für den Benutzer formatieren, verwenden Sie sie nicht
round
. Verwenden Sieto_char
(siehe: Datentyp-Formatierungsfunktionen im Handbuch), mit dem Sie ein Format angeben und eintext
Ergebnis erhalten können, das nicht von der Verrücktheit Ihrer Client-Sprache mitnumeric
Werten beeinflusst wird. Beispielsweise:to_char
rundet Zahlen für Sie im Rahmen der Formatierung. DasFM
Präfix gibt an,to_char
dass Sie keine Auffüllung mit führenden Leerzeichen wünschen.quelle
ROUND(CAST(FLOAT8 '3.1415927' AS NUMERIC),2);
, erhalte ich '0.314E1'. Und ich habe meinen Code noch geschrieben,ROUND(AVG(val),2)
bekomme aber immer noch den Fehler, den ich in meiner Frage beschrieben habe.ROUND(CAST(FLOAT8 '3.1415927' AS NUMERIC),2);
auf PgAdmin und Ruby gelaufen . Mit PgAdmin bekomme ich 3.14, aber mit Ruby (mit dem Sequel-Juwel) bekomme ich '0.314E1'. Ich frage mich, warum das ist ...double
Version vonround
müsste zurückgebennumeric
oder (ugh)text
, also könnte es genauso gut einnumeric
Argument sein.Versuchen Sie auch die alte Syntax für das Casting,
funktioniert mit jeder Version von PostgreSQL.
Es gibt einen Mangel an Überladungen in einigen PostgreSQL-Funktionen, warum (???): Ich denke, "es ist ein Mangel" (!), Aber @CraigRinger, @Catcall und das PostgreSQL-Team sind sich über "pgs historische Begründung" einig.
PS: Ein weiterer Punkt beim Runden ist die Genauigkeit . Überprüfen Sie die Antwort von @ IanKenney .
Überladung als Casting-Strategie
Sie können die ROUND-Funktion mit überladen .
Jetzt funktioniert Ihre Anweisung einwandfrei. Versuchen Sie es (nach der Funktionserstellung).
Es wird jedoch ein NUMERIC-Typ zurückgegeben. Um die erste Überlastung bei der allgemeinen Nutzung zu erhalten, können wir einen FLOAT-Typ zurückgeben, wenn ein TEXT-Parameter angeboten wird.
Versuchen
PS: Überprüfung
\df round
nach Überladungen, zeigt etwas wie,Die
pg_catalog
Funktionen sind die Standardfunktionen, siehe Handbuch der eingebauten mathematischen Funktionen .quelle
Versuchen Sie es damit:
Oder einfach:
quelle
Sie können die folgende Funktion verwenden
Das Ergebnis zeigt:
Sie können Ihre Variable auch in den gewünschten Typ umwandeln:
quelle
Laut Bryans Antwort können Sie dies tun, um Dezimalstellen in einer Abfrage zu begrenzen. Ich konvertiere von km / h in m / s und zeige es in Dygraphen an, aber als ich es in Dygraphen gemacht habe, sah es komisch aus. Sieht gut aus, wenn stattdessen die Berechnung in der Abfrage durchgeführt wird. Dies ist auf postgresql 9.5.1.
quelle
Versuchen Sie, Ihre Spalte in eine Zahl wie folgt umzuwandeln:
quelle
Lösung : Sie müssen einen Typ hinzufügen, damit es funktioniert
Ex:
round(extract(second from job_end_time_t)::integer,0)
quelle
Wählen Sie ROUND (SUM (Betrag) :: numerisch, 2) als total_amount FROM-Transaktionen
gibt: 200234.08
quelle