2015-12-21 27 views
0

我得到一个奇怪的错误,当我尝试在子查询得到SUM(...)柱,然后让行“指标”:如何将“行位置”添加到来自子查询的具有SUM(...)列的查询中?

WITH lb(displayName, val) AS (
    SELECT user.displayName, SUM(stats.weight) AS val FROM stats 
    LEFT OUTER JOIN user ON user.id = stats.userId 
    GROUP BY user.id 
    ORDER BY val DESC 
) 
SELECT displayName, val, (SELECT COUNT(*) FROM lb b WHERE a.val <= b.val) AS position FROM lb a 

我得到的错误,当我在SQLiteBrowser运行,它是: misuse of aggregate: SUM():接着是查询的全文。

但是,查询工作正常,如果我可以:

  • 从最终删除, (SELECT COUNT(*) FROM lb b WHERE a.val <= b.val) AS position选择;
  • 不使用SUM。

(但我确实需要两者)

这里是(工作)例(sqlfiddle),其中排索引丢失(这也包括一些测试数据):http://sqlfiddle.com/#!5/b1cc3/1/0

我怎样才能解决它,所以它会工作(也就是说,添加行号到结果集)?

我需要这些索引,因为我要在此查询后添加WHERE子句,并且我需要知道保留的行的顺序。

例如,对于在上面的拨弄的测试数据的有用的结果是:

| displayName | val | position | 
|-------------|------|----------| 
|  name2 | 1256 |  1 | 
|  name4 | 133 |  2 | 
|  name5 | 62 |  3 | 
|  name3 | 43 |  4 | 

(位置可能以及从0开始,这不是重要的)

P.S.用其他东西替换SQL实现(SQLite)不是一种选择(至少现在不是)

+1

适用于我(3.8.12)。请注意,ORDER BY必须位于外部查询中。 –

+0

@CL。我尝试将ORDER BY移动到外部查询,查询仍然中断,并出现相同的错误。让我检查版本... –

+0

我的第一个评论中的两个句子是独立的。 –

回答

0

感谢CL.的评论,很明显查询正在使用更新版本的SQLite。

所以这个问题很可能是sqlitebrowser(和sqlfiddle也是)使用过时的SQLite版本。 (我打开an issue in sqlitebrowser repository关于这个问题)