【问题标题】:SQL Insert missing values from Lookup table to transaction tableSQL将查找表中的缺失值插入事务表
【发布时间】:2015-05-20 08:07:51
【问题描述】:

我有一个表EmpJob 列出了员工、已完成的工作和已完成工作的次数(列:EmpID、JobID、Total)。我有另一个查找表Jobs,它列出了所有作业(列:JobID、JobDesc)。雇员不得从事所有工作。我的要求是向所有员工展示所有工作,其中未完成工作的计数为零。 我对此一无所知。我尝试在WHERE 子句中使用IF EXISTS 子句或NOT EXISTS,但这并没有给我正确的结果。 这是一个例子: 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 as

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

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

【问题讨论】:

    标签: sql sql-server-2008 tsql


    【解决方案1】:

    要遵循的策略草图:

    • 获取一组员工:

      select distinct EmpID from EmpJob // query1(如果您没有其他员工来源)
    • 获得工作和员工的交叉产品:

      select EmpID,JobID,0 as Total from 外连接 Jobs // query2
    • 将已知计数和 0 计数合并:

      select EmpID,JobID,Total from EmpJob union // query3
    • 总结每个(员工,工作)组的总数

      选择 EmpID,JobID,sum(Total) from group by EmpID,JobID

    将各个部分组合在一起即可得到结果:

    从 ( (从 Jobs 外连接中选择 EmpID、JobID、0 作为 Total(从 EmpJob 中选择不同的 EmpID)) 联盟 (从 EmpJob 中选择 EmpID、JobID、Total) ) 按 EmpID、JobID 分组 按 EmpID、JobID 排序

    【讨论】:

    • 在 Jobs 上使用 Left Outer Join,您会得到 EmpID 和 JobID 为 NULLS,总行数为 0。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    • 2020-01-15
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多