是否可以在SQLite.Swift中执行以下查询而无需求助于任意SQL(我确实可以使用,但希望避免)?
select table1.id, sum(table1.col1*table2.col2)
from table1, table2
where table1.id=table2.id
group by table1.id
我尝试了以下操作:SQL(通过asSQL()
)似乎是正确的,但是我找不到从返回的行中引用聚合列的方法。
let query = table1.select(id, (table1[column1]*table2[column2]).sum
.join(table2, on: table1[id] == table2[id])
.group(id)
您能以某种方式为列加上别名吗?
答案 0 :(得分:0)
使用
select id, sum(table1.col1*table2.col2)
from table1, table2
were table1.id=table2.id
group by id
将在两列中显示结果(更正,请参见下文),即 id 和 sum(table1,col * table2.col2) < / p>
但是,由于存在两个这样的源列,因此两种ID的用法都将模棱两可。 因此,应更改查询(请参见以下代码:假设您要使用table1中的ID(由于连接而使用table2都没关系)
另外 were
不是关键字,它应该是 WHERE
使用 AS
关键字来创建别名,别名可能会使事情变得更容易。该folloiwng还包括 AS 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
在没有数据的情况下运行它会导致:-
答案 1 :(得分:0)
好的,我找到了解决方案,只用了2天!
在SQLite.swift中为列添加别名的方法是使用表达式。 表达式的名称成为列别名。
所以不是
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)
}