通过连接其他表向结果集中添加两个额外的列

Adding two extra columns to result set by joining other tables

我有 4 个 table:

任务table

 (task_id , department_id , task_title , task_description , task_start_date , task_due_date , task_rating , task_is_completed)

员工table

 (employee_id , department_id , employee_name , employee_salary ,  employee_hire_date)

部门table

 (department_id , department_name)

employees_tasks加入table

 (employee_id , task_id)

每个 table 都是房间数据库中的一个实体。

我想 return 2 个额外的列与 (select * from employees) 一个用于计算员工的评分(通过获取任务 table 中 task_rating 列的平均值,任务必须完成)另一列用于显示该员工的任务 运行 的数量(通过使用 task_is_completed = 0 )

获取任务中的行数

我不知道 table 加入哪个 table。我们设法通过使用 union 和 left join 创建了两个单独的 SQL 语句 return 那些 2 列,但是它们非常丑陋并且在组合它们时不起作用。

我们尝试过的

select employees.employee_name , employees.employee_id ,avg(tasks.task_rating)  as Ratings from employees , tasks inner join employees_tasks on(employees.employee_id = employees_tasks.employee_id )AND tasks.task_id = employees_tasks.task_id where tasks.task_is_completed = 1 group by (employees.employee_name ) 
union select employees.employee_name, employees.employee_id, avg(0) as Ratings from employees where employees.employee_id  not in (select employees.employee_id from employees , tasks inner join employees_tasks on(employees.employee_id = employees_tasks.employee_id ) AND tasks.task_id = employees_tasks.task_id where tasks.task_is_completed = 1 group by (employees.employee_name ) ) group by employees.employee_id order by employees.employee_id ;

select employees.employee_name , employees.employee_id ,count(tasks.task_title)  as tasks_Running from employees , tasks inner join employees_tasks on(employees.employee_id = employees_tasks.employee_id )AND tasks.task_id = employees_tasks.task_id where tasks.task_is_completed = 0  group by (employees.employee_name ) 
union select employees.employee_name , employees.employee_id ,0   as tasks_Running  from employees  where (employees.employee_id  not in (select employees.employee_id from employees , tasks inner join employees_tasks on(employees.employee_id = employees_tasks.employee_id )AND tasks.task_id = employees_tasks.task_id where tasks.task_is_completed = 0  group by (employees.employee_name )))group by (employees.employee_name) order by employees.employee_id ; 

我们希望输出是这样的

 (employee_id , department_id , employee_name , employee_salary ,  employee_hire_date , ratings , numTasksRunning)

我相信以下内容可能适合 :-

WITH 
  -- Common Table Expression 1 - Average of Completed Tasks per employee
    employee_completedtask_info AS (
        SELECT employees.employee_id,avg(tasks.task_rating) AS atr
            FROM employees_tasks
                JOIN tasks ON employees_tasks.task_id = tasks.task_id
                JOIN employees ON employees_tasks.employee_id = employees.employee_id
            WHERE tasks.task_is_completed > 0
            GROUP BY employees.employee_id
    ),
    -- Common Table Expression 2 - Incompleted Taks per employee
    employee_notcompleted_info AS (
        SELECT employees.employee_id,count() AS itc
            FROM employees_tasks
                JOIN tasks ON employees_tasks.task_id = tasks.task_id
                JOIN employees ON employees_tasks.employee_id = employees.employee_id
            WHERE tasks.task_is_completed = 0
            GROUP BY employees.employee_id
    ),
    -- Common Table Expression 3 - Total Tasks per Employee
    employee_total_tasks AS (
        SELECT employees.employee_id,count() AS ttc
            FROM employees_tasks
                JOIN tasks ON employees_tasks.task_id = tasks.task_id
                JOIN employees ON employees_tasks.employee_id = employees.employee_id
            GROUP BY employees.employee_id
    )
    SELECT employees.employee_name, 
        CASE WHEN atr IS NOT NULL THEN atr ELSE 0 END AS average_completed_task_rating,
        CASE WHEN itc IS NOT NULL THEN itc ELSE 0 END AS incomplete_task_count,
        CASE WHEN ttc IS NOT NULL THEN ttc ELSE 0 END AS total_task_count
        FROM employees 
            LEFT JOIN employee_completedtask_info ON employees.employee_id = employee_completedtask_info.employee_id
            LEFT JOIN employee_notcompleted_info ON employees.employee_id = employee_notcompleted_info.employee_id
            LEFT JOIN employee_total_tasks ON employees.employee_id = employee_total_tasks.employee_id
    ;

基于以下生成的数据:-

DROP TABLE IF EXISTS employees;
CREATE TABLE IF NOT EXISTS employees (employee_id INTEGER PRIMARY KEY, department_id INTEGER, employee_name TEXT, employee_salary REAL,  employee_hire_date TEXT);
DROP TABLE IF EXISTS departments;
CREATE TABLE IF NOT EXISTS departments (department_id INTEGER PRIMARY KEY, department_name TEXT);
DROP TABLE IF EXISTS employees_tasks;
CREATE TABLE IF NOT EXISTS employees_tasks (employee_id INTEGER, task_id INTEGER, PRIMARY KEY(employee_id, task_id));

INSERT INTO departments VALUES
    (null,'Maths'),(null,'English'),(null,'Craft')
;
INSERT INTO employees VALUES
    (null,1,'Fred',55000,'2000-01-02'),
    (null,2,'Mary',62000,'1996-03-20'),
    (null,3,'Tom',52000,'2004-10-11'),
    (null,3,'Susan',72000,'1999-06-14'),
    (null,2,'Bert',66000,'2000-10-15'),
    (null,1,'Jane',70000,'1992-04-02')
;
INSERT INTO tasks VALUES
    (null,3,'Task 001 - Craft','Do the Craft thinggy','2018-01-01','2018-08-19',10,0),
    (null,1,'Task 002 - Maths','Do the Maths thinggy','2018-03-14','2019-03-13',20,0),
    (null,2,'Task 003 - English','Do the English thinggy','2018-02-14','2018-09-14',8,0),
    (null,3,'Task 004 - Craft','Do the Craft job','2018-01-01','2018-08-19',10,1),
    (null,1,'Task 005 - Maths','Do the Maths job','2018-03-14','2019-03-13',20,1),
    (null,2,'Task 006 - English','Do the English job','2018-02-14','2018-09-14',8,1),
    (null,3,'Task 007 - Craft','Craft thinggy','2018-03-03','2018-11-21',10,0),
    (null,1,'Task 008 - Maths','Maths thinggy','2018-03-14','2019-03-13',20,0),
    (null,2,'Task 009 - English','English thinggy','2018-02-14','2018-09-14',8,0)
;
INSERT INTO employees_tasks VALUES
    (1,2),(1,5),(1,8),(1,6),
    (2,2),
  (3,1),(3,4),(3,7)
;

这导致:-

  • 注意这会将 null 条目转换为 0(即在上面没有 Susan、Bert 和 Jane 的任务,因此他们的任务为 null counts/averages,这使事情变得有点复杂,因此 CASE WHEN ... THEN ... ELSE .... END AS 子句)。
  • 请注意,我已经包含了总任务数,因为这可能是 useful/wanted(第三个 CTE 提取了此信息)