当我在DB Browser for SQLite中运行此查询时:
SELECT week
, SUM (CASE when activityType = 'rockclimbing' then elapsedTime else 0 END) AS rockclimbing
, SUM (CASE when activityType = 'hike' then elapsedTime else 0 END) AS hike
, SUM (CASE when activityType = 'run' then elapsedTime else 0 END) AS run
FROM activity
WHERE year=2016
AND activityType IN ('rockclimbing', 'hike', 'run')
GROUP BY week
ORDER BY week;
它返回我要查找的数据:
week rockclimbing hike run
"1" "0" "0" "2.09"
"2" "0" "0" "4.63"
"3" "0" "0" "7.22"
"4" "0" "0" "2.94"
"5" "0" "0" "5.59"
(忽略"引号"。随后复制/粘贴包含它们的数据。)
然而,当我使用.query()将此查询传递给Sequelize时,我收到错误:misuse of aggregate: SUM()
这是我的Sequelize代码:
sequelize.query('SELECT week, SUM (CASE when activityType = "rockclimbing" then elapsedTime else 0 END) AS rockclimbing, SUM (CASE when activityType = "hike" then elapsedTime else 0 END) AS hike, SUM (CASE when activityType = "run" then elapsedTime else 0 END) AS run FROM activity WHERE year=2016 AND activityType IN ("rockclimbing", "hike", "run") GROUP BY week ORDER BY week;', { model: Activity }).then(...etc..).catch(...etc...);
以下是Sequelize生成的查询并在我的控制台中输出:
Executing (default): SELECT week, SUM (CASE when activityType = "rockclimbing" then elapsedTime else 0 END) AS rockclimbing, SUM (CASE when activityType = "hike" then elapsedTime else 0 END) AS hike, SUM (CASE when activityType = "run" then elapsedTime else 0 END) AS run FROM activity WHERE year=2016 AND activityType IN ("rockclimbing", "hike", "run") GROUP BY week ORDER BY week;
我的JavaScript .catch()
错误并将其记录到控制台:
.catch(function(err) {
console.log('Error! ', err);
});
所以我看到这个错误对象已经注销到我的控制台:
{ SequelizeDatabaseError: SQLITE_ERROR: misuse of aggregate: SUM()
at Query.formatError (/xxx/xxx/project_name/node_modules/sequelize/lib/dialects/sqlite/query.js:348:14)
at afterExecute (/xxx/xxx/project_name/node_modules/sequelize/lib/dialects/sqlite/query.js:112:29)
at replacement (/xxx/xxx/project_name/node_modules/sqlite3/lib/trace.js:19:31)
at Statement.errBack (/xxx/xxx/project_name/node_modules/sqlite3/lib/sqlite3.js:16:21)
name: 'SequelizeDatabaseError',
message: 'SQLITE_ERROR: misuse of aggregate: SUM()',
parent:
{ Error: SQLITE_ERROR: misuse of aggregate: SUM()
at Error (native)
errno: 1,
code: 'SQLITE_ERROR',
sql: 'SELECT week, SUM (CASE when activityType = "rockclimbing" then elapsedTime else 0 END) AS rockclimbing, SUM (CASE when activityType = "hike" then elapsedTime else 0 END) AS hike, SUM (CASE when activityType = "run" then elapsedTime else 0 END) AS run FROM activity WHERE year=2016 AND activityType IN ("rockclimbing", "hike", "run") GROUP BY week ORDER BY week;' },
original:
{ Error: SQLITE_ERROR: misuse of aggregate: SUM()
at Error (native)
errno: 1,
code: 'SQLITE_ERROR',
sql: 'SELECT week, SUM (CASE when activityType = "rockclimbing" then elapsedTime else 0 END) AS rockclimbing, SUM (CASE when activityType = "hike" then elapsedTime else 0 END) AS hike, SUM (CASE when activityType = "run" then elapsedTime else 0 END) AS run FROM activity WHERE year=2016 AND activityType IN ("rockclimbing", "hike", "run") GROUP BY week ORDER BY week;' },
sql: 'SELECT week, SUM (CASE when activityType = "rockclimbing" then elapsedTime else 0 END) AS rockclimbing, SUM (CASE when activityType = "hike" then elapsedTime else 0 END) AS hike, SUM (CASE when activityType = "run" then elapsedTime else 0 END) AS run FROM activity WHERE year=2016 AND activityType IN ("rockclimbing", "hike", "run") GROUP BY week ORDER BY week;' }
这是什么问题?为什么此查询在数据库浏览器中有效但在我的应用程序中无效?
我在发布此问题之前搜索了Internet和Stackoverflow。虽然some questions did touch on my issue当我尝试时没有任何建议/解决方案帮助我/工作。
答案 0 :(得分:2)
这里有一些细微差别,其中一个很重要:我在javascript中转换了'
和"
个字符。
> Executing (default): SELECT * FROM `activity`
[ { activityType: 'rockclimbing',
year: 2017,
week: 1,
elapsedTime: 1.2345 },
{ activityType: 'rockclimbing',
year: 2017,
week: 2,
elapsedTime: 1.2345 },
{ activityType: 'rockclimbing',
year: 2017,
week: 3,
elapsedTime: 66.45 },
{ activityType: 'hike', year: 2017, week: 1, elapsedTime: 1.2345 },
{ activityType: 'hike',
year: 2017,
week: 2,
elapsedTime: 3.141592 },
{ activityType: 'hike', year: 2017, week: 3, elapsedTime: -1 },
{ activityType: 'hike', year: 2017, week: 4, elapsedTime: 10000 },
{ activityType: 'run', year: 2017, week: 4, elapsedTime: 10 },
{ activityType: 'run', year: 2017, week: 5, elapsedTime: 100 },
{ activityType: 'run', year: 2017, week: 6, elapsedTime: 1000 } ]
> sequelize.query("SELECT week, SUM (CASE when activityType = 'rockclimbing' then elapsedTime else 0 END) AS rockclimbing, SUM (CASE when activityType = 'hike' then elapsedTime else 0 END) AS hike, SUM (CASE when activityType = 'run' then elapsedTime else 0 END) AS run FROM activity WHERE year=2017 AND activityType IN ('rockclimbing', 'hike', 'run') GROUP BY week ORDER BY week", { type: sequelize.QueryTypes.SELECT}).then(function(activities) {console.log(activities)})
Promise {
_bitField: 0,
_fulfillmentHandler0: undefined,
_rejectionHandler0: undefined,
_promise0: undefined,
_receiver0: undefined }
> Executing (default): SELECT week, SUM (CASE when activityType = 'rockclimbing' then elapsedTime else 0 END) AS rockclimbing, SUM (CASE when activityType = 'hike' then elapsedTime else 0 END) AS hike, SUM (CASE when activityType = 'run' then elapsedTime else 0 END) AS run FROM activity WHERE year=2017 AND activityType IN ('rockclimbing', 'hike', 'run') GROUP BY week ORDER BY week
结果:
[ { week: 1, rockclimbing: 1.2345, hike: 1.2345, run: 0 },
{ week: 2, rockclimbing: 1.2345, hike: 3.141592, run: 0 },
{ week: 3, rockclimbing: 66.45, hike: -1, run: 0 },
{ week: 4, rockclimbing: 0, hike: 10000, run: 10 },
{ week: 5, rockclimbing: 0, hike: 0, run: 100 },
{ week: 6, rockclimbing: 0, hike: 0, run: 1000 } ]
DDL& DML:
sqlite> create table activity ( activityType varchar(20), year int, week int, elapsedTime float);
sqlite> insert into activity values ('rockclimbing',2017,1,1.2345);
sqlite> insert into activity values ('rockclimbing',2017,2,1.2345);
sqlite> insert into activity values ('rockclimbing',2017,3,66.45);
sqlite> insert into activity values ('hike',2017,1,1.2345);
sqlite> insert into activity values ('hike',2017,2,3.141592);
sqlite> insert into activity values ('hike',2017,3,-1);
sqlite> insert into activity values ('hike',2017,4,10000);
sqlite> insert into activity values ('run',2017,4,10);
sqlite> insert into activity values ('run',2017,5,100);
sqlite> insert into activity values ('run',2017,6,1000);
SQLite期待单引号,并且似乎抛出了错误的错误。
> sequelize.query('SELECT week, SUM (CASE when activityType = "rockclimbing" then elapsedTime else 0 END) AS rockclimbing, SUM (CASE when activityType = "hike" then elapsedTime else 0 END) AS hike, SUM (CASE when activityType = "run" then elapsedTime else 0 END) AS run FROM activity WHERE year=2017 AND activityType IN ("rockclimbing", "hike", "run") GROUP BY week ORDER BY week', { type: sequelize.QueryTypes.SELECT}).then(function(activities) {console.log(activities)})
Promise {
_bitField: 0,
_fulfillmentHandler0: undefined,
_rejectionHandler0: undefined,
_promise0: undefined,
_receiver0: undefined }
> )Executing (default): SELECT week, SUM (CASE when activityType = "rockclimbing" then elapsedTime else 0 END) AS rockclimbing, SUM (CASE when activityType = "hike" then elapsedTime else 0 END) AS hike, SUM (CASE when activityType = "run" then elapsedTime else 0 END) AS run FROM activity WHERE year=2017 AND activityType IN ("rockclimbing", "hike", "run") GROUP BY week ORDER BY week
Unhandled rejection SequelizeBaseError: SQLITE_ERROR: misuse of aggregate: SUM()
at Query.formatError (/Users/bryan/node_modules/sequelize/lib/dialects/sqlite/query.js:348:14)
at afterExecute (/Users/bryan/node_modules/sequelize/lib/dialects/sqlite/query.js:112:29)
at Statement.errBack (/Users/bryan/node_modules/sqlite3/lib/sqlite3.js:16:21)