【问题标题】:Conditional sum in slick (scala)光滑的条件总和(scala)
【发布时间】:2015-10-29 19:48:27
【问题描述】:

我正在尝试将以下 SQL 重写为 slick:

SELECT id
SUM(
 if (spend > 0, 1, 0)
)
FROM items
GROUP by id

我当前的代码与此类似:

items.groupBy(r => r.id).map {
  case (id, group) => (id, group.map { r => if (r.spend > 0) 1 else 0 }.sum)
}

但我收到以下错误:

polymorphic expression cannot be instantiated to expected type; found : [R]slick.lifted.Rep[R] required: Boolean

我也尝试使用filterlength,但没有成功。我怎样才能实现我的目标?

【问题讨论】:

    标签: sql scala slick


    【解决方案1】:

    Slick 已经为此提供了解决方案 (documentation):

    items.groupBy(r => r.id).map {
      case (id, group) => (id, group.map { r => 
        Case If r.spend > BigDecimal(0.0) Then 1 Else 0 
      }.sum)
    }
    

    【讨论】:

      【解决方案2】:

      Scala 三元表达式无法转换为流畅的语法。

      最简单的方法就是把这里的查询简化为

      SELECT COUNT(id)
      FROM items
      WHERE spend > 0
      GROUP by id
      

      相应的光滑将是

      items.filter(_.spend > 0).groupBy(_.id) map {
            case (id, group) => (id, group.size)
          }
      

      或者您可以尝试使用SimpleFunction 访问if 函数:

      def ifFun[T] = SimpleFunction.ternary[Boolean, T, T, T]("if")
      
      items.groupBy(_.id) map {
        case (id, group) => (id, group.map(r => ifFun(r.spend > 0, 1, 0)).sum)
      }
      

      【讨论】:

      • 查询当然可以简化,但实际上我的真实查询要复杂得多,有多个连接。第二种方案可能有用,我试试看。
      • 好的,我知道了:Case If r.spend > BigDecimal(0.0) Then 1 Else 0
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多