Knex: 如何执行复杂的求和

创建于 2016-08-04  ·  3评论  ·  资料来源: knex/knex

_(注意:我使用的是 Postgres;这可能不适用于其他方言)_

我有一个查询,它返回一个平均分数,以及通过的人数,一个测验。 这是我正在尝试做的简化版本:

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' );

(注意sum

不幸的是,这并没有像我预期的那样呈现SUM函数:

sum("(case when qs"."score >= 60 then 1 else 0 end)") as "passedCount"
  1. 目前有没有办法做“复杂”的总和?
  2. 如果没有,是否有人反对我添加sumRaw函数?

最有用的评论

在#238 中找到了解决方法; 在select而不是sum knex.raw 现在我输入它似乎很明显......

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' );

所有3条评论

如果用knex.raw将参数包装到sum $ 是否有效?

看起来不像...如果我将总和更改为:

.sum( knex.raw( '(case when qs.score >= 60 then 1 else 0 end) AS passedCount' ) )

我收到错误“val.toLowerCase 不是函数”

(我试过用parenteses,没有,添加as别名,把它拿走,每次的错误都是一样的)

堆栈跟踪:

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 版本是 0.11.7,虽然我升级到 0.11.9 并得到相同的消息。

在#238 中找到了解决方法; 在select而不是sum knex.raw 现在我输入它似乎很明显......

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' );
此页面是否有帮助?
0 / 5 - 0 等级

相关问题

fsebbah picture fsebbah  ·  3评论

sandrocsimas picture sandrocsimas  ·  3评论

zettam picture zettam  ·  3评论

marianomerlo picture marianomerlo  ·  3评论

tjwebb picture tjwebb  ·  3评论