_(Hinweis: Ich verwende Postgres; dies gilt möglicherweise nicht für andere Dialekte)_
Ich habe eine Abfrage, die eine durchschnittliche Punktzahl und die Anzahl der bestandenen Personen zurückgibt, ein Quiz. Hier ist eine vereinfachte Version dessen, was ich versuche zu tun:
knex( 'quiz_submissions AS qs' )
.select( 'q.name AS quiz_name' )
.avg( 'qs.score' )
.sum( '(case when qs.score >= 60 then 1 else 0 end) AS passedCount' )
.innerJoin( 'quizzes AS q', 'q.id', 'qs.quiz_id' )
.groupBy( 'q.name' );
(Beachten Sie die sum
)
Leider wird die Funktion SUM
dadurch nicht so gerendert, wie ich es erwarte:
sum("(case when qs"."score >= 60 then 1 else 0 end)") as "passedCount"
sumRaw
-Funktion hinzufüge?Funktioniert es, wenn Sie Ihr Argument mit knex.raw in sum
knex.raw
?
Sieht nicht so aus ... Wenn ich die Summe so ändere:
.sum( knex.raw( '(case when qs.score >= 60 then 1 else 0 end) AS passedCount' ) )
Ich erhalte die Fehlermeldung „val.toLowerCase ist keine Funktion“
(Ich habe es mit Parentesen versucht, ohne den Alias as
hinzuzufügen, ihn wegzunehmen, der Fehler war jedes Mal derselbe)
Stack-Trace:
TypeError: val.toLowerCase is not a function
at QueryCompiler_PG.aggregate (../../src/query/compiler.js:166:25)
at QueryCompiler_PG.columns (../../src/query/compiler.js:152:25)
at ../../src/query/compiler.js:82:22
at Array.map (native)
at QueryCompiler_PG.select (../../src/query/compiler.js:81:35)
at QueryCompiler_PG.toSQL (../../src/query/compiler.js:45:5)
at QueryBuilder.toSQL (../../src/query/builder.js:41:49)
at ../src/runner.js:34:7
at tryCatcher (util.js:16:23)
at using.js:185:26
at tryCatcher (util.js:16:23)
at Promise._settlePromiseFromHandler (promise.js:504:31)
at Promise._settlePromise (promise.js:561:18)
at Promise._settlePromise0 (promise.js:606:10)
at Promise._settlePromises (promise.js:685:18)
at Promise._fulfill (promise.js:630:18)
From previous event:
at Promise.longStackTracesCaptureStackTrace [as _captureStackTrace] (debuggability.js:369:19)
at Promise._then (promise.js:230:17)
at Promise.then (promise.js:123:17)
at Function.Promise.using (using.js:169:14)
at Runner.run (../src/runner.js:27:20)
at QueryBuilder.Target.then (../src/interface.js:22:50)
at process._tickCallback (node.js:369:9)
Knex-Version ist 0.11.7, obwohl ich auf 0.11.9 aktualisiert habe und dieselbe Meldung erhalten habe.
Problemumgehung in #238 gefunden; Machen Sie das knex.raw
in select
statt in sum
. Scheint offensichtlich zu sein, jetzt wo ich es schreibe ...
knex( 'quiz_submissions AS qs' )
.select( 'q.name AS quiz_name', knex.raw( 'SUM(case when qs.score >= 60 then 1 else 0 end) AS passedCount' ) )
.avg( 'qs.score' )
.innerJoin( 'quizzes AS q', 'q.id', 'qs.quiz_id' )
.groupBy( 'q.name' );
Hilfreichster Kommentar
Problemumgehung in #238 gefunden; Machen Sie das
knex.raw
inselect
statt insum
. Scheint offensichtlich zu sein, jetzt wo ich es schreibe ...