在Slick中通过查询对组中的列进行乘法运算

时间:2014-01-08 11:42:21

标签: scala slick

我遇到了使用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)

感谢。

1 个答案:

答案 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(...)