在循环中如果一条记录通过检查,如何设置值

时间:2012-04-27 15:20:20

标签: sql oracle

我正在加入两个表EmployeeWages。现在一个员工可以有多个工资,因为他们可以在不同的项目中工作,我想要他的工资总和。还有一个名为Employee_benefits_Claimed_Ind的列。这是一个指示器,指示员工是否在每个项目中声明了任何好处。他可以为一些项目申请福利,而不是对某些项目提出索赔,但就我而言,如果他甚至就一个他没有资格的项目申请受益,他就可以申请。这是我要填充的表格:

CREATE TABLE EMPLOYEE_QUAL
(Employee_id NUMBER,
 TOTAL_WAGES NUMBER,
EMPLOYEE_disQUALIFY CHAR(1))


INSERT INTO EMPLOYEE_QUAL(Employee_id, Total_wages, EMployee_disQualify)
SELECT      c_Employee_id,
            c_Total_wages,
            c_Employee_disQualify
FROM        (
                Select  Employee_ID as c_Employee_id
                from    Employees
            ) e
LEFT JOIN   (
                Select      SUM(Wages),
                            Employee_disQualify
                from        wages
                group by    Employee_disQualify
            ) w on e.employee_id = w.employee_id

但是,如果一名员工要求一方受益而另一方没有受益,那么由于GROUP BY,这只会有两个条目。理想情况下,它应该只是一个条目,Employee_disqualify_ind为'Y',因为他声称在一个项目中获益。如果他没有在另一个上,那没关系。我该如何实现这一目标?

1 个答案:

答案 0 :(得分:2)

我会猜测你真正在说什么。

英文:对于Employees.Employee_ID指定的所有员工,总结WAGES表上的工资,并设置EMployee_disQualify' = 'Y' if any of the salary.Employee_disqualify`标志设置为是。

在SQL中,那将是:

SELECT e.Employee_ID,
       sum(w.wages),
       case when 
          (sum (case w.Employee_disQualify WHEN 'Y' THEN 1 else 0 end)) > 0
              THEN 'Y'
              ELSE 'N'
       end
FROM Employees e
LEFT JOIN wages w 
   on e.employee_id = w.employee_id
group by e.employee_ID

(我刚刚展示了选择)。

主要技巧是将employee_disqualify标志转换为数字(使用CASE),以便可以轻松聚合,然后将此聚合的结果转换回Y或N w /另一个{{ 1}}。如果在任何匹配的行中存在至少一个Y,则总和将> 1,所以,你将得到一个Y作为你的最终结果。否则,N。(再次,我猜测你的领域是如何设置的。)

如果您没有汇总,我可以使用内联CASE类型的cluase,但您已经为select 'Y' where exists . .进行了汇总,并且这是在同一扫描中计算的通过sum(wages)表,这应该是合理有效的。

例如,请参见此处:http://sqlfiddle.com/#!4/67691/2