我正在加入两个表Employee
和Wages
。现在一个员工可以有多个工资,因为他们可以在不同的项目中工作,我想要他的工资总和。还有一个名为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',因为他声称在一个项目中获益。如果他没有在另一个上,那没关系。我该如何实现这一目标?
答案 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