Sqlite 聚合查询
是否可以在SQLite.Swift中执行以下查询,而不必使用任意SQL(我确实可以使用SQL,但希望避免这种情况) 我尝试了以下操作:SQL(通过Sqlite 聚合查询,sqlite,aggregate-functions,sqlite.swift,Sqlite,Aggregate Functions,Sqlite.swift,是否可以在SQLite.Swift中执行以下查询,而不必使用任意SQL(我确实可以使用SQL,但希望避免这种情况) 我尝试了以下操作:SQL(通过asSQL())看起来是正确的,但我找不到从返回行引用聚合列的方法 let query = table1.select(id, (table1[column1]*table2[column2]).sum .join(table2, on: table1[id] == table2[id]) .group(
asSQL()
)看起来是正确的,但我找不到从返回行引用聚合列的方法
let query = table1.select(id, (table1[column1]*table2[column2]).sum
.join(table2, on: table1[id] == table2[id])
.group(id)
您能以某种方式为列别名吗?使用
select id, sum(table1.col1*table2.col2)
from table1, table2
were table1.id=table2.id
group by id
将在两列中产生(请参见下面的更正),即id和sum(表1,col*table2.col2)
然而,id的两种用法在编码时都是不明确的,因为有两个这样的源列。
因此,应该更改查询(参见下面的代码,假设您需要表1中的id(如果由于连接而使用了表2则无关紧要))
另外,WARE
不是关键字,它应该是其中
使用作为
关键字创建别名可能会使事情变得更简单。下面的内容还包括作为mysumcolumn
,因此生成的列将是id和mysumcolumn
select table1.id, sum(table1.col1*table2.col2) AS mysumcolumn
from table1, table2
where table1.id=table2.id
group by table1.id
在没有数据的情况下运行此操作会导致:-
好的,我找到了解决方案,只花了我两天时间 在SQLite.swift中为列别名的方法是使用表达式。 表达式的名称将成为列别名 所以不是
let query = table1.select(id, (table1[column1]*table2[column2]).sum)
.join(table2, on: table1[id] == table2[id])
.group(id)
使用:
编辑以更正打字错误和列歧义。
let query = table1.select(id, (table1[column1]*table2[column2]).sum)
.join(table2, on: table1[id] == table2[id])
.group(id)
let aggrColumn = (table1[column1]*table2[column2]).sum
let query = table1.select(id, aggrColumn)
.join(table2, on: table1[id] == table2[id])
.group(id)
let results = try db.prepare(query)
for row in results {
myAggrColumn = try row.get(aggrColumn)
}