我遇到了使用group by at Summarizing/aggregating a Scala Slick object into another
想要在应用sum函数之前将两个或多个列(_.countA * _countB)相乘,如下所示,但是它会返回一个错误“预期收集类型,找到{s2:Int / Number(10) ......“。处理这种情况的任何建议。
Query(Things).filter(_.date > date).groupBy(x => (x.labelOne, x.labelTwo)).map
{
case ((labelOne, labelTwo), things) => {
(labelOne, labelTwo, things.map(_.countA*_.countB).sum)
}
}.run.map(SummarizedThing.tupled)
感谢。
答案 0 :(得分:1)
您应该可以通过以下方式执行此操作:
在查询之外定义操作
//multiplication operator
val multiply = SimpleBinaryOperator.apply[Int]("*")
确保类型(Int)与列的值匹配,并且运算符符号与我们的SQL数据库语言中使用的运算符匹配。
现在你应该可以使用
了things.map{case (thingA,thingB) => multiply(thingA, thingB)}.sum
做你想做的事。
另请参阅:http://slick.typesafe.com/doc/1.0.1/lifted-embedding.html#user-defined-functions-and-types
由于存在错误,显然无法在groupBy中执行算术运算。您可以通过将查询包装在另一个查询中来解决此问题:
(for{
product <- (for{
intA <- A
intB <- B
} yield multiply(intA,intB))
} yield product).groupby(...).map(...)