SQL将缺少的值从Lookup表插入到事务表中

时间:2015-05-20 08:07:51

标签: sql sql-server-2008 tsql

我有一个表EmpJob列出了员工,完成工作和完成工作的次数(列:EmpID,JobID,总计)。我有另一个列出所有作业的查找表Jobs(列:JobID,JobDesc)。员工可能无法完成所有工作。我的要求是向所有员工显示所有工作,其中包括未完成工作的计数为零。 我对此毫无头绪。我尝试在IF EXISTS条款中使用NOT EXISTS条款或WHERE,但这并没有给我正确的结果。 这是一个例子: Jobs表:

JobID | JobDesc
---------------
 1    | Job1
 2    | Job2
 3    | Job3

EmpJob表:

EmpID | JobID | Total
 Emp1 |     1 | 3
 Emp1 |     3 | 5
 Emp2 |     2 | 6

结果应为3 Jobs x 2 Employees = 6 records

Emp1 | Job1 | 3
Emp1 | Job2 | 0
Emp1 | Job3 | 5
Emp2 | Job1 | 0
Emp2 | Job2 | 6
Emp2 | Job3 | 0

有人可以提出查询吗?提前谢谢。

1 个答案:

答案 0 :(得分:0)

要遵循的策略草图:

  • 获得一组员工:

    select distinct EmpID from EmpJob // query1
    (如果您没有其他员工来源)

  • 获得工作和员工的交叉产品:

    select EmpID,JobID,0 as Total from <query1> outer join Jobs // query2
    

  • 进行已知计数和0计数的联合:

    select EmpID,JobID,Total from EmpJob union <query2> // query3
    

  • 总结每个(员工,工作)小组的总数

    select EmpID,JobID,sum(Total) from <query3> group by EmpID,JobID
    

将各个部分放在一起会得到结果:

select EmpID, JobID, sum(Total) as Total from (
  (select EmpID, JobID, 0 as Total from Jobs outer join (select distinct EmpID from EmpJob))
  union
  (select EmpID, JobID, Total from EmpJob)
) group by EmpID, JobID
order by EmpID, JobID