Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQLite中计算多个聚合时,是否可以消除子查询?_Sqlite_Subquery_Aggregate Functions - Fatal编程技术网

在SQLite中计算多个聚合时,是否可以消除子查询?

在SQLite中计算多个聚合时,是否可以消除子查询?,sqlite,subquery,aggregate-functions,Sqlite,Subquery,Aggregate Functions,我目前正在查看SQLite 3.8.7.1(Debian Jessie)中的评级数据库,我很难从一个查询中获得想要返回到web应用程序的聚合 翻阅我对uni的SQL类的记忆和大量文档,我得到了一个查询,可以找到总评分,加上每个被评分项目的正负计数,但我不相信我有一个明智的方法来做这件事,或者它会特别有效 最基本的部分在sqlfiddle.comas上 基本上,我有一个项目键,然后是评分人的用户名,在所有情况下当前设置为NULL的语言字段,评分日期,以及值字段中的1或-1。我想返回一个包含所有项目

我目前正在查看SQLite 3.8.7.1(Debian Jessie)中的评级数据库,我很难从一个查询中获得想要返回到web应用程序的聚合

翻阅我对uni的SQL类的记忆和大量文档,我得到了一个查询,可以找到总评分,加上每个被评分项目的正负计数,但我不相信我有一个明智的方法来做这件事,或者它会特别有效

最基本的部分在
sqlfiddle.com
as上

基本上,我有一个项目键,然后是评分人的用户名,在所有情况下当前设置为
NULL
的语言字段,评分日期,以及值字段中的
1
-1
。我想返回一个包含所有项目的表,其中包含正面评级数、负面评级数和总体评级(正面减去负面)列

我能以某种方式删除子查询还是使它们更有效?我可以在SQLite中采用其他方法吗


实际上,我的查询返回一个负数表示总的负面评级;我能肯定这一点吗?

这是一个基于聚合函数的提案
在一个公共表表达式的基础上,用“< /代码>”编写两个键<代码>组。 我将负片的值更改为正数,
当然,它们被算作负数。
我还避免了“NULL”条目,因为它们很难看,而且它还确保min/max返回其边0或0。
否则,我相信结果就是期望的输出

with subtotals(titem, subtotal) as 
(select item
      , sum(value) 
 from ratings
 group by item, value)
select titem as item
     , sum(subtotal) as total
     , max(0, max(subtotal)) as pos
     , -1*min(0, min(subtotal)) as neg
from subtotals
group by titem;
输出(
.width 20
.headers on
.mode columns
):

您可能会将公共表表达式计算为一个子查询,但它只是一个子查询。
对速度进行有意义的测试可能需要数据库的全部内容,而不是很小的麻烦

item                  total       pos         neg
--------------------  ----------  ----------  ----------
africa                1           2           1
cant-buy-me-love      3           3           0
happy-together        -2          0           2
solitaire             0           1           1