Sqlite 聚合查询

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(

是否可以在SQLite.Swift中执行以下查询,而不必使用任意SQL(我确实可以使用SQL,但希望避免这种情况)

我尝试了以下操作:SQL(通过
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
将在两列中产生(请参见下面的更正),即idsum(表1,col*table2.col2)

然而,id的两种用法在编码时都是不明确的,因为有两个这样的源列。 因此,应该更改查询(参见下面的代码,假设您需要表1中的id(如果由于连接而使用了表2则无关紧要))

另外,
WARE
不是关键字,它应该是
其中

使用
作为
关键字创建别名可能会使事情变得更简单。下面的内容还包括
作为mysumcolumn
,因此生成的列将是idmysumcolumn

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)
}