切换功能和SQL中Null的无效使用

时间:2019-12-11 19:18:33

标签: sql ms-access max

我有一个查询,我希望结果根据其“顺序号”返回个人的DOB。它会正确返回个人的姓名,但不会返回正确的DOB。我之所以使用MAX函数,是因为我需要将所有这些数据都放在一行上,如果不使用它,那么如果与一个员工相关的受抚养人不止一个,我将得到多行。

但是,如果有多个依赖项而不是对应于D.SequentialNumber = 1的依赖项,它将拉动最大DOB,这不是我所需要的。我在这里想念什么?

下面是我的查询的一个小样本:

SELECT EIN.EIN, E.First_Name, E.Last_Name, 
Max(IIf(D.SequentialNumber=1,D.DepFirstName)) AS Cov24_First_Name, 
Max(IIf(D.SequentialNumber=1,D.DepLastName)) AS Cov24_Last_Name, 
Max(IIf(D.SequentialNumber=1 AND nz(D.DepDOB) > 0, "")) AS Cov24_SSN,
 Max(IIf(D.SequentialNumber=1 and D.CoveredIndividualSSN >0, "", d.DepDOB)) AS Cov24_DOB

FROM (tblEmp AS E LEFT JOIN tblEIN AS EIN ON E.EIN = EIN.EIN) LEFT JOIN tblDep AS D ON E.Emp_SSN = D.ResponsibleIndividualSSN
GROUP BY EIN.EIN, E.First_Name, E.Middle_Name, E.Last_Name;

3 个答案:

答案 0 :(得分:0)

我认为情况是倒退的,您可能想要:

Max(IIf(D.SequentialNumber=1 and D.CoveredIndividualSSN >0, d.DepDOB, NULL)) AS Cov24_DOB

答案 1 :(得分:0)

我不确定该查询:

SELECT EIN.EIN, E.First_Name, E.Last_Name, 
Max(IIf(D.SequentialNumber=1,D.DepFirstName, "")) AS Cov24_First_Name, 
Max(IIf(D.SequentialNumber=1,D.DepLastName, "")) AS Cov24_Last_Name, 
Max(IIf(D.SequentialNumber=1 AND nz(D.DepDOB) > 0, "", 0)) AS Cov24_SSN,
 Max(IIf(D.SequentialNumber=1 and D.CoveredIndividualSSN >0, "", d.DepDOB, "")) AS Cov24_DOB

FROM (tblEmp AS E LEFT JOIN tblEIN AS EIN ON E.EIN = EIN.EIN) LEFT JOIN tblDep AS D ON E.Emp_SSN = D.ResponsibleIndividualSSN
GROUP BY EIN.EIN, E.First_Name, E.Middle_Name, E.Last_Name;

答案 2 :(得分:0)

不确定查询是否应该只限于SequentialNumber = 1的雇员,或者查询是否应处理所有依赖项。为了获得更好的答案,请澄清查询的目的,因为我们也许可以更好地了解下游步骤。

SELECT  DISTINCT
        EIN.EIN
        ,E.First_Name
        ,E.Last_Name
        ,D.DepFirstName AS Cov24_First_Name
        ,D.DepLastName AS Cov24_Last_Name
        ,D.ResponsibleIndividualSSN AS Cov24_SSN
        ,CASE
            WHEN NULLIF(D.CoveredIndividualSSN,'') IS NULL THEN D.DepDOB
        END AS Cov24_DOB
FROM    tblEmp AS E
        LEFT OUTER JOIN tblEIN AS EIN ON E.EIN = EIN.EIN
        LEFT OUTER JOIN tblDep AS D ON E.Emp_SSN = D.ResponsibleIndividualSSN
WHERE   D.SequentialNumber = 1