我已经阅读了相当多的解决我的问题但我似乎无法让它工作。这似乎是一个简单的问题,但我没有得到我想要的结果集。
我正在编写一份报告,需要从两个表中提取并基本上为每个员工创建一行数据。该文件需要上传到医疗保健供应商。
以下是数据的示例
表1:EmployeeCheckDeduction
Employee ID Deduction Amount Check Date
1234 50.00 6/30/2015
1234 50.00 7/15/2015
4567 100.00 6/30/2015
4567 100.00 7/15/2015
9876 75.00 6/30/2015
9876 75.00 7/15/2015
表2:雇主贡献
Employee ID Contribution Amount Check Date
1234 25.00 6/30/2015
1234 30.00 7/15/2015
4567 50.00 6/30/2015
4567 60.00 7/15/2015
部分问题在于,表1中的每条记录都不会在表2中有相应的匹配。如果它们的贡献最大,那么它们就不会收到一笔。我想要的是一个看起来像这样的结果集:
Employee ID Deduction Amount Contribution Amount Check Date
1234 50.00 25.00 6/30/2015
1234 50.00 30.00 7/15/2015
4567 100.00 50.00 6/30/2015
4567 100.00 60.00 7/15/2015
9876 75.00 0.00 6/30/2015
9876 75.00 0.00 7/15/2015
无论我如何尝试加入,它只是重复数据。我尝试过使用子查询或不同的记录,无论我尝试什么,它都没有给我我想要的东西。我无法弄清楚我做错了什么。
编辑。有关数据集结果,请参阅下面的链接。
http://s000.tinyupload.com/index.php?file_id=01551050904538574848
http://s000.tinyupload.com/index.php?file_id=63978789937644749322
http://s000.tinyupload.com/index.php?file_id=28700836121558977952
我认为问题的一部分是在Employee Check Deduction表中有一个特定的扣除代码,我正在推出。在雇主扣除表中,该代码也存在。但是,每当我尝试在员工ID和支票日期之外的那两个字段上添加联接时,如果没有相应的员工支票扣除表中的扣除金额的员工,则不会返回结果。在雇主供款表中记录。我希望有所帮助。
答案 0 :(得分:0)
select a.employee_id, a.deduction_amount, b.contribution_amount,
a.check_date
from employeecheckdeduction a join employercontribution b
on a.employee_id = b.employee_id
and a.check_date = b.check_date
如有必要,请通过重命名列来尝试此操作。你应该加入就业和结帐。
答案 1 :(得分:0)
这里的问题是你正在处理两件不同的事情:
a)您想要一份所有曾经有过捐款和/或扣除的员工的完整清单
b)然后你想把它显示在一行
虽然有很多方法可以解决这个问题,但第一件事就是将两者分开并处理它们。
还不清楚您是否想要GROUP BY员工ID,或者您是否希望查看完整历史记录。如果您要查看历史记录,最好的方法是使用全加入,例如:
select coalesce(d.employee_id,c.employee_id) employee_id
, d.deduction_amount
, c.contribution_amount
, coalesce(d.deducation_date,c.contribution_date) check_date
from employee_deduction d
full join employee_contribution c on c.employee_id = d.employee_id
where d.DED_CD = 'H' or c.MEMO_CD = 'H'
FULL JOIN
做的是包括第一个表中的所有记录和连接表中的所有记录,无论两个表中是否都有空值。
这就是为什么你必须在select子句中使用coalesce
语句,以确保你不会在结果集中使用空值。
希望这有效。
答案 2 :(得分:0)
SELECT a.EMPLID as EmployeeID, a.AL_AMOUNT as EmployeeContribution, ISNULL(b.AL_AMOUNT, 0) AS EmployerContribution, a.CHECK_DT
FROM PS_AL_CHK_DED as a
LEFT JOIN PS_AL_CHK_MEMO as b ON a.EMPLID = b.EMPLID AND a.CHECK_DT = b.CHECK_DT
WHERE a.AL_DEDCD = 'H'
ORDER BY a.CHECK_DT