将两个表中的数据合并为一行

时间:2015-07-23 21:55:12

标签: sql

我已经阅读了相当多的解决我的问题但我似乎无法让它工作。这似乎是一个简单的问题,但我没有得到我想要的结果集。

我正在编写一份报告,需要从两个表中提取并基本上为每个员工创建一行数据。该文件需要上传到医疗保健供应商。

以下是数据的示例

表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和支票日期之外的那两个字段上添加联接时,如果没有相应的员工支票扣除表中的扣除金额的员工,则不会返回结果。在雇主供款表中记录。我希望有所帮助。

3 个答案:

答案 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