0

我正在加入两张桌子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”,因为他声称在一个项目中受益。如果他没有在另一个上也没关系。我该如何实现这一目标?

4

1 回答 1

2

我要猜你到底在说什么。

英文:对于由 指定的所有员工Employees.Employee_ID,在WAGES表上汇总工资,并设置工资EMployee_disQualify' = 'Y' if any of the。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/ another CASE。如果任何匹配行中至少有一个 Y,那么总和将 > 1,因此,您将得到一个 Y 作为最终结果。否则,N。(我再次猜测您的字段是如何设置的。)

如果您不进行聚合,我可能会使用内联select 'Y' where exists . .类型的 cluase 来执行此操作,但无论如何您已经在聚合,sum(wages)并且这是在通过表的同一扫描中计算的wages,因此这应该是相当有效的。

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

于 2012-04-27T16:02:54.137 回答