0

我有一个包含 A 和 C 列的表 T,我想从中检索平均计数,如下所示:

select avg(AC) as AV
from
( 
 select A, count(1) as AC
 from T
 where C = 1
 group by A
)

我如何在 GORM 中做到这一点?GRAILS 2.2.0 版我尝试按照文档进行操作,但没有很好的示例。我什至无法让子查询工作:(

更新

我能够让计数部分工作。现在仍然确定如何获得平均值,因为我不知道如何从查询中进行选择。

def tc = T.createCriteria()

def tCounts = tc.buildCriteria {
    and {
        eq 'C', 1
    }
    projections {
       groupProperty 'A'
       rowCount('AC')
    }
}
4

2 回答 2

1

更新
最近发现内存数据库被限制avg()count(). 经过多次交叉检查,发现使用 Oracle db 实际上下面的 HQL 可以产生适当的结果,并且可以消除从 db 获取行然后在 Groovy 中计算平均值的复杂性:

T.executeQuery("select avg(count(t)) from Team as t where t.c = 1 group by t.a")

我在内存数据库中遇到的问题被展示为一个示例


INIT
在我第一次查看查询时,我认为它可以通过 using 来实现,DetachedCriteriaavg投影只能应用于域属性,但不能应用于count(). HQL 也是如此。

您可以使用withCriteria和 groovy的组合collect来获得 A 的平均计数:

def countOfA = T.withCriteria{
    eq 'c', 1
    projections{
        count 'a'
        groupProperty 'a'
    }
}?.collect{it?.first()}

def averageCount = countOfA ? (countOfA.sum() / countOfA.size()) : 0
于 2013-07-16T04:51:12.250 回答
0

这是在 HQL 中完成的。在我的一个域的 grails 控制台中进行了测试:

T.executeQuery("""
select avg(count(*))
from T t
where t.c = 1
group by t.a
""")
于 2013-07-16T12:25:06.910 回答