我有两个表,一个包含零件成本,另一个包含人工成本。
我想加入这些表来显示所有人工和零件成本,但Part Costs
表中有一些记录在Labour Costs
表中不存在,反之亦然。
Call Ref Serial Number Parts Costs
1111 AB66 12
2222 AC66 100
3333 AD66 200
4444 AE66 55
5555 AF66 54
Call Ref Serial Number Labour Costs
8888 AG66 200
1111 AB66 300
2222 AC66 400
9999 AH66 500
我想要达到的结果是:
Call Ref Serial Number Parts Costs Labour Costs
1111 AB66 12 300
2222 AC66 100 400
3333 AD66 200 0
4444 AE66 55 0
5555 AF66 54 0
8888 AG66 0 200
9999 AH66 0 500
答案 0 :(得分:1)
我假设您的加入密钥是Call Ref + Serial Number。
在MS SQL Server中,您可以使用完整联接来实现上述目的:
SELECT CallRef = ISNULL(pc.CallRef, lc.CallRef),
SerialNumber = ISNULL(pc.SerialNumber, lc.SerialNumber),
PartCost = ISNULL(pc.PartCost, 0),
LaborCost = ISNULL(lc.LaborCost, 0)
FROM PartCost pc
FULL JOIN LaborCost lc ON pc.CallRef = lc.CallRef AND pc.SerialNumber = lc.SerialNumber
答案 1 :(得分:1)
你正在寻找的是一个完整的外部联盟。
例如:
SELECT
COALESCE(LC.call_ref, PC.call_ref) AS call_ref,
COALESCE(LC.serial_number], PC.serial_number) AS serial_number,
LC.cost AS labour_costs,
PC.cost AS parts_costs
FROM
Labour_Costs LC
FULL OUTER JOIN Parts_Costs PC ON
PC.call_ref = LC.call_ref AND
PC.serial_number = LC.serial_number
您应该考虑删除数据库中表/列名称中的空格。一些第三方产品不能很好地与它们配合使用,并且它们可以使编码麻烦,因为您需要始终使用括号作为对象名称(也使代码不易读取,IMO)。
此外,此代码未考虑在其中一个表中出现多行以获得相同引用/序列号的可能性。如果有可能,那么您需要SUM
费用并添加GROUP BY
。