2015-10-29 2 views
0

Я пытаюсь переписать следующий SQL в пятне:Условная сумма в гладком (Скале)

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

Я также попытался использовать filter и length, но без успеха. Как я могу достичь своей цели?

ответ

2

Слик уже предлагает решение для этого (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) 
    } 

Или вы могли бы попытаться получить доступ к функции if с помощью SimpleFunction:

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) 
} 
+1

Запрос, конечно, может быть упрощен, но на самом деле мой реальный запрос намного сложнее с несколькими объединениями. Второе решение может быть полезно, я попробую. –

+3

Хорошо, я понял: 'Случай Если r.spend> BigDecimal (0.0) Тогда 1 Осталось 0' –

+0

@Peter Krejci круто. Это стоит того, чтобы ответить. – Odomontois

Смежные вопросы