带有布尔值字段的SQL视图

时间:2014-11-06 17:20:24

标签: sql view boolean-logic

我面前的任务真让我高兴。

我有以下格式的表格 员工 employee_id 是自动递增的字段,充当主键。 employee_number 是公司为员工提供的ID,在整个表格中是唯一的。

enter image description here

还有另一个名为 Employee_Assignment 的表,其中包含员工对项目的分配信息。此表将仅包含具有分配的员工的信息。一名员工可以有一项或多项任务。此表使用 Employee 表中的 employee_id 字段作为外键。此外,每个项目分配中的员工状态由 assignment_status_id 字段确定。

enter image description here

Assignment_Status 表格如下。有两种类型的' Active'状态 - Active1和Active2。同样,有两种类型的“非活动”'状态 - Inactive1和Inactive2: enter image description here

我想创建一个视图 Assignment_Status_View ,其格式如下:

enter image description here

视图应列出Employee表中的所有员工以及一个布尔值,该值指示它们是否在任何项目中处于活动状态。随着新员工的加入,新记录将添加到 员工 表中。此外,对于每个新项目分配,新记录将添加到 Employee_Assignment 表中。该视图应该能够捕获这两者。

overall_status 字段应显示员工'所有项目任务的状态,即,如果员工有10个任务,并且如果他/她处于所有任务中的2个非活动状态中的任何一个,那么 overall_status = 0.同样,如果员工在至少一个项目分配中处于2个活动状态中的任何一个,然后 overall_status = 1。

非常感谢您提供给我的任何帮助。

1 个答案:

答案 0 :(得分:2)

基于CASE的聚合可用于查看员工是否至少存在一个活动状态。

使用left join确保在分配状态中没有记录的员工也会被计算在内。

        SELECT E.employee_Number, E.name, T.OverAllStatus  FROM 
        employee E
        JOIN (
            SELECT E.employee_Number, 
                   case when COALESCE(SUM( case when EA.assignment_status_id in ( 1,3)  
                                       then 1 
                                       else 0 
                                       end ),0) >0 
                   then 1 else 0 end as OverAllStatus
            FROM Employee E
            LEFT JOIN Employee_Assignment EA
            ON E.employee_id = EA.employee_id
            GROUP BY E.employee_Number
        ) T
        ON E.employee_Number = T.employee_Number