聚合查询

时间:2018-08-26 10:14:02

标签: sqlite aggregate-functions sqlite.swift

是否可以在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)

您能以某种方式为列加上别名吗?

2 个答案:

答案 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

在没有数据的情况下运行它会导致:-

enter image description here

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