2015-10-29 61 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

我還試圖用filterlength,但沒有成功。我怎樣才能實現我的目標?

回答

2

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

斯卡拉三元表達式不能轉移到光滑的語法。

最簡單的方法就是在這裏簡化查詢到

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

該查詢當然可以簡化,但實際上我的真正的查詢是多複雜多連接。第二種解決方案可能很有用,我會試一試。 –

+3

好吧,我明白了:'如果r.spend> BigDecimal(0.0)然後1否則0' –

+0

@Peter Krejci酷。它值得自我回答。 – Odomontois