Skip to content

示例

查询所有部门信息

scala
val q = query:
    from[Department]

查询2020年1月1日后入职的员工信息

scala
val q = query:
    from[Employee]
        .filter(e => e.hireDate > LocalDate.of(2020, 1, 1))

查询员工姓名和对应的部门名称

scala
val q = query:
    from[Employee]
        .join[Department]((e, d) => e.departmentId == d.id)
        .map((e, d) => (employeeName = e.name, departmentName = d.name))

已知某员工id,查询比此员工薪水高的所有员工id和姓名

scala
val employeeId: Int = ???

val q = query:
    val querySalary = from[Employee]
        .filter(_.id == employeeId)
        .map(_.salary)

    from[Employee]
        .filter(_.salary > querySalary)
        .map(e => (id = e.id, name = e.name))

按部门统计员工平均薪水

scala
val q = query:
    from[Employee]
        .groupBy(e => (deptId = e.departmentId))
        .map((g, e) => (deptId = g.deptId, salary = avg(e.salary)))

查询至少有一个员工的部门id

scala
val q = query:
    from[Department]
        .leftJoin[Employee]((d, e) => d.id == e.departmentId)
        .groupBy((d, _) => (id = d.id))
        .having((_, _) => count() > 0)
        .map((g, _) => g.id)

查询所有员工和其上级的姓名

scala
val q = query:
    from[Employee]
        .leftJoin[Employee]((e1, e2) => e1.managerId == e2.id)
        .map((e1, e2) => (name = e1.name, managerName = e2.name))

按部门统计薪水前三高的员工姓名

scala
val q = query:
    val subquery = from[Employee]
        .join[Department]((e, d) => e.departmentId == d.id)
        .map: (e, d) =>
            (
                employeeName = e.name,
                departmentName = d.name,
                rank = denseRank() over (partitionBy (d.id) sortBy (e.salary.desc))
            )
        
    fromQuery(subQuery).filter(r => r.rank <= 3)

计算员工的入职天数

scala
import scala.language.postfixOps

val q = query:
    from[Employee].map: e => 
        extract(day from (now() - e.hireDate))

计算员工的收入评级

scala
val q = query:
    from[Employee]
        .map: e =>
            (
                name = e.name,
                income =
                    `if` e.salary >= 50000 `then` "高"
                    `else if` e.salary >= 20000 && e.salary < 50000 `then` "中"
                    `else` "低"
            )

统计比同部门平均收入高的员工

scala
val q = query:
    from[Employee]
        .filter: e1 => 
            e1.salary >
                from[Employee]
                    .filter(e2 => e1.departmentId == e2.departmentId)
                    .map(e2 => avg(e2.salary))