2

我有这个带有两列的丑陋源数据,我们称它们EmpIDSomeCode. 通常 EmpID 映射到EmployeeListing表。但有时,人们会在SomeCode字段中输入员工 ID。

之前在 Excel 中运行此报告的人通过使用 if 语句执行多个 vlookup,以及运行一些手动检查以确保结果准确,“解决了”这个问题。当我将这些文件移动到 Access 时,我不确定如何最好地处理这种情况。

理想情况下,我希望告诉我的查询SomeCode如果EmpID为空,则执行左连接,否则左连接EmpID

不幸的是,我无法在源数据中强制验证或任何类似的东西。

这是我正在处理的完整 SQL 查询:

SELECT DDATransMaster.Fulfillment, 

DDATransMaster.ConfirmationNumber, 
DDATransMaster.PromotionCode,
DDATransMaster.DirectSellerNumber, 
NZ([DDATransMaster]![DirectSellerNumber],[DDATransMaster]![PromotionCode]) AS EmpJoin,
EmployeeLookup.ID AS EmpLookup,

FROM FROM DDATransMaster

LEFT JOIN EmployeeLookup ON NZ([DDATransMaster]![DirectSellerNumber],[DDATransMaster]![PromotionCode])  = EmployeeLookup.[Employee #])
4

3 回答 3

3

您可以像这样创建查询:

SELECT
    IIf(EmpID Is Null, SomeCode, EmpID) AS join_field,
    field2,
    etc
FROM YourTable

或者,如果查询将始终在 Access 会话中使用,Nz则更简洁。

SELECT
    Nz(EmpID, SomeCode) AS join_field,
    field2,
    etc
FROM YourTable

当您将该查询连接到另一个表时,Access 查询设计器可以表示join_field另一个表中的某个匹配字段之间的连接。如果您尝试将IIforNz作为连接ON子句的一部分,则查询设计器无法在设计视图中正确显示连接 --- 它仍然可以工作,但如果您是 Access SQL 的新手,则可能不方便。

看看这个 SQL 是否给了你想要的东西。

SELECT
    dda.Fulfillment, 
    dda.ConfirmationNumber, 
    dda.PromotionCode,
    dda.DirectSellerNumber, 
    NZ(dda.DirectSellerNumber,dda.PromotionCode) AS EmpJoin,
    el.ID AS EmpLookup
FROM
    DDATransMaster AS dda
    LEFT JOIN EmployeeLookup AS el
    ON NZ(dda.DirectSellerNumber,dda.PromotionCode) = el.[Employee #])

但我会Nz在子查询中使用该部分。

SELECT
    sub.Fulfillment, 
    sub.ConfirmationNumber, 
    sub.PromotionCode,
    sub.DirectSellerNumber, 
    sub.EmpJoin,
    el.ID AS EmpLookup
FROM
    (
        SELECT
            Fulfillment, 
            ConfirmationNumber, 
            PromotionCode,
            DirectSellerNumber, 
            NZ(DirectSellerNumber,PromotionCode) AS EmpJoin
        FROM DDATransMaster
    ) AS sub
    LEFT JOIN EmployeeLookup AS el
    ON sub.EmpJoin = el.[Employee #])
于 2013-04-29T16:09:25.363 回答
1

您可以使用Union

SELECT DDATransMaster.Fulfillment, 
DDATransMaster.ConfirmationNumber, 
DDATransMaster.PromotionCode,
DDATransMaster.DirectSellerNumber, 
EmployeeLookup.ID AS EmpLookup
FROM DDATransMaster
LEFT JOIN EmployeeLookup ON 
DDATransMaster.DirectSellerNumber = EmployeeLookup.[Employee #]
where DDATransMaster.DirectSellerNumber IS NOT NULL

Union

SELECT DDATransMaster.Fulfillment, 
DDATransMaster.ConfirmationNumber, 
DDATransMaster.PromotionCode,
DDATransMaster.DirectSellerNumber, 
EmployeeLookup.ID AS EmpLookup
FROM DDATransMaster
LEFT JOIN EmployeeLookup ON 
DDATransMaster.PromotionCode = EmployeeLookup.[Employee #]
where DDATransMaster.DirectSellerNumber IS NULL;
于 2013-04-29T16:15:44.953 回答
1

关于什么:

LEFT JOIN EmployeeListing ON NZ(EmpID, SomeCode)

作为您的加入,nz() 如果第一个参数为空,则使用第二个参数,我不能 100% 确定这种加入在访问中有效。不过值得尝试 20 秒。

希望它有效。

于 2013-04-29T16:07:02.223 回答