0
votes

Quel est le moyen le plus intelligent d'ignorer les nulls et d'afficher une seule valeur pour une colonne qui fait partie d'une plus grande requête?

Je travaille avec une table qui ressemble à ceci comme suit:

|   |  Name | UsrID | NumofCases |
|---|:-----:|-------|:----------:|
| 1 | Smith | 88885 |      6     |


2 commentaires

Pouvez-vous clarifier que vous souhaitez la dernière valeur (par daeseen ) non-null pour chacun des dl_no , ssn , adresse / code> et que daeseen est toujours peuplé.


SQL Server ou Sybase? Quelle version?


3 Réponses :


0
votes

C'est quelque chose qui peut aider:

SELECT TOP 50 Name, UsrID, COUNT(DISTINCT CaseID) as NumofCases,
(select top 1 b.DL_NO FROM People b where a.UsrID = b.UsrID and ltrim(rtrim(b.DL_NO)) <> '' and b.DL_NO is not null order by b.DateSeen desc) as DL_NO,
(select top 1 b.SSN  FROM People b where a.UsrID = b.UsrID and ltrim(rtrim(b.SSN)) <> '' and b.SSN is not null order by b.DateSeen desc) as SSN,
(select top 1 b.Address FROM People b where a.UsrID = b.UsrID and ltrim(rtrim(b.Address)) <> '' and b.Address is not null order by b.DateSeen desc) as Address,
FROM People a
WHERE DateSeen between '01/31/2019' and '10/02/2019'
GROUP BY Name, UsrID


0 commentaires

0
votes

Vous pouvez essayer ci-dessous Query -

SELECT Name
      ,COUNT(DISTINCT CaseID) OVER(PARTITION BY Name)
      ,UsrID
      ,MAX(DL_NO) DL_NO
      ,MAX(SSN) SSN
      ,MAX(Address) Address
      ,MAX(DateSeen) DateSeen
FROM People
WHERE DateSeen BETWEEN 01/31/2019 AND 10/02/2019
GROUP BY Name, UsrID
ORDER BY DateSeen desc


0 commentaires

0
votes

Si vous contrôlez le modèle de données, la normalisation de vos tables rendrait le problème beaucoup plus simple. Il empêcherait également des incohérences de données comme l'incohérence de l'adresse de votre exemple de données xxx

alors votre requête est triviale xxx

et vous pouvez ajouter la date ou des filtres comptent.


0 commentaires