Функция переключения и недопустимое использование Null в SQL - PullRequest
0 голосов
/ 11 декабря 2019

У меня есть запрос, в котором я хочу, чтобы результат возвратил DOB для человека в соответствии с его «порядковым номером». Он возвращает имя человека правильно, но не его правильную DOB. Я использую функцию MAX, потому что мне нужны все эти данные в одной строке, и если я не использую их, я получаю несколько строк, если с сотрудником связано более одного иждивенца.

Однако, этотянет Max DOB, если есть несколько зависимых, а не тот, который соответствует D.SequentialNumber = 1, что не то, что мне нужно. Что мне здесь не хватает?

Ниже приведен небольшой пример моего запроса:

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 голосов
/ 11 декабря 2019

Я не уверен насчет запроса:

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;
0 голосов
/ 11 декабря 2019

Не уверен, если запрос должен быть ограничен только сотрудником с 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
0 голосов
/ 11 декабря 2019

Я думаю, что условия обратные, и вы можете захотеть:

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