0
votes

Fonction de commutation et utilisation non valide de NULL dans SQL

J'ai une requête où je souhaite le résultat de renvoyer le DOB pour une personne en fonction de leur "numéro séquentiel". Il renvoie correctement le nom de l'individu, mais pas leur dob correct. J'utilise une fonction max car j'ai besoin de toutes ces données sur une rangée et si je ne l'utilise pas, je reçois plusieurs rangées s'il y a plus d'une personne à charge associée à un employé.

Toutefois, il tire la Max Dob s'il y a plusieurs personnes à charge et non celle correspondant à D.EncidollyNumber = 1, ce qui n'est pas ce dont j'ai besoin. Qu'est-ce que je manque ici?

ci-dessous est un mini échantillon de ma requête: xxx


7 commentaires

Tagez votre question avec la base de données que vous utilisez.


Êtes-vous sur l'accès MS?


Oui je suis sur Access @martin


IIF a une valeur de retour en deux parties pour la vraie condition et la valeur de retour pour la fausse condition: iif (EXPR, TruePart, FalsePart)


La requête est-elle censée renvoyer des informations sur les personnes à charge, ou devrait-elle être isolée à l'employé?


Contrairement à d'autres langues, iif dans l'accès nécessite toujours TruePart et FalsePart, même si le faux ne renvoie rien. Voir: support.office.com/ EN-US / Article / ...


@Jennaterral; Veuillez fournir plus d'informations sur votre question.


3 Réponses :


0
votes

Je pense que les conditions sont à l'envers et que vous souhaiterez peut-être:

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


1 commentaires

J'ai besoin que le dob ne soit retourné que s'il n'y a pas de SSN



0
votes

Je ne suis pas sûr de la requête:

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;


3 commentaires

Qu'est-ce que tu n'es pas sûr? Ça marche, je viens de la condenser parce que le tout est énorme


Veuillez clarifier ce que vous n'êtes pas sûr de. Si vous n'êtes pas sûr de la requête originale d'OP, veuillez indiquer ce que vous avez trouvé incorrect. Si vous n'êtes pas sûr de la solution que vous fournissez, envisagez de le tester et de relire votre code pour vous assurer que c'est une réponse précise.


Pas sûr parce que je n'ai pas les données d'échantillonnage, veuillez donc accepter comme réponse si elle fonctionne.



0
votes

incertain si la requête est censée être scopée à seulement l'employé avec séquentialienNumber = 1, ou si la requête doit gérer toutes les personnes à charge. Pour une meilleure réponse, veuillez clarifier sur l'intention de la requête, car nous pourrons peut-être économiser des étapes en aval avec une meilleure compréhension.

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


1 commentaires

Il est destiné à continuer avec des nombres séquentiels supplémentaires, mais une fois que j'ai cette première partie, je peux alors l'appliquer au reste