Knex: рдЬрдЯрд┐рд▓ рдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 4 рдЕрдЧре░ 2016  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: knex/knex

_(рдиреЛрдЯ: рдореИрдВ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ; рдпрд╣ рдЕрдиреНрдп рдмреЛрд▓рд┐рдпреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ)_

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдкреНрд░рд╢реНрди рд╣реИ рдЬреЛ рдПрдХ рдФрд╕рдд рдЕрдВрдХ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдЬрд┐рддрдиреЗ рд▓реЛрдЧ рдЙрддреНрддреАрд░реНрдг рд╣реБрдП рд╣реИрдВ, рдПрдХ рдкреНрд░рд╢реНрдиреЛрддреНрддрд░реАред рдореИрдВ рдЬреЛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЙрд╕рдХрд╛ рдПрдХ рд╕рд░рд▓реАрдХреГрдд рд╕рдВрд╕реНрдХрд░рдг рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

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 рдореЗрдВ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓рд╛; sum рдХреЗ рдмрдЬрд╛рдп knex.raw рдореЗрдВ select sum рдХрд░реЗрдВред рдЕрдм рд╕реНрдкрд╖реНрдЯ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рдЯрд╛рдЗрдк рдХрд░рддрд╛ рд╣реВрдВ ...

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 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рддрд░реНрдХ рдХреЛ sum рдХреЗ рд╕рд╛рде knex.raw рдкрд░ рд▓рдкреЗрдЯрддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?

рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛... рдЕрдЧрд░ рдореИрдВ рдпреЛрдЧ рдХреЛ рдЗрд╕рдореЗрдВ рдмрджрд▓ рджреВрдВ:

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

рдореБрдЭреЗ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ "val.toLowerCase рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рд╣реИ"

(рдореИрдВрдиреЗ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рд╕рд╛рде рдХреЛрд╢рд┐рд╢ рдХреА, рдмрд┐рдирд╛ 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 рдореЗрдВ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓рд╛; sum рдХреЗ рдмрдЬрд╛рдп knex.raw рдореЗрдВ select sum рдХрд░реЗрдВред рдЕрдм рд╕реНрдкрд╖реНрдЯ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рдЯрд╛рдЗрдк рдХрд░рддрд╛ рд╣реВрдВ ...

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 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

zettam picture zettam  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

fsebbah picture fsebbah  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

sandrocsimas picture sandrocsimas  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

legomind picture legomind  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

npow picture npow  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ