Aggregations with "Group by"
Slick also provides a groupBy
method that behaves like the
groupBy
method of native Scala collections. Let's get a list of candidates with all the donations for each candidate:
scala> val grouped = Tables.transactions.groupBy { _.candidate } grouped: scala.slick.lifted.Query[(scala.slick.lifted.Column[... scala> val aggregated = grouped.map { case (candidate, group) => (candidate -> group.map { _.amount }.sum) } aggregated: scala.slick.lifted.Query[(scala.slick.lifted.Column[... scala> val groupedDonations = db.withSession { implicit session => aggregated.list } groupedDonations: List[(String, Option[Long])] = List((Bachmann, Michele,Some(7439272)),...
Let's break this down. The first statement, transactions.groupBy { _.candidate }
, specifies the key by which to group. You can think of this as building an intermediate list of (String, List[Transaction])
tuples mapping the group key to a list of all the table rows that satisfy this...