我有一张带有A列和A列的表T. C,我想从中检索平均数如下:
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')
}
}
答案 0 :(得分: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")
我在内存数据库中遇到的问题是showcased as a sample。
<强> INIT 强>
在我第一次查看查询时,我认为可以使用DetachedCriteria
来实现,但avg
投影只能应用于域属性,但不能应用于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
答案 1 :(得分:0)
这是在HQL中完成的。在我的一个域名的grails控制台中测试:
T.executeQuery("""
select avg(count(*))
from T t
where t.c = 1
group by t.a
""")