Filtrage des Nulls à partir de plusieurs colonnes

À l'aide de SQL Server 2005.

Les données se trouvent dans deux arrays distincts et je n'ai reçu que des permissions d'écriture.

Les données ressemblent à:

DateTime1 | DateTime2 ----------------------- 2012-06-01 | 2012-06-01 2012-06-02 | 2012-06-02 2012-06-04 | 2012-06-05 2012-06-02 | NULL NULL | 2012-06-05 2012-06-04 | 2012-06-05 NULL | NULL 

Ce que j'essaie de faire est de pouvoir countr les valeurs dans lesquelles DateTime1 et DateTime2 contiennent des valeurs, DateTime1 contient une date et DateTime2 est NULL, DateTime1 est NULL et DateTime2 contient des valeurs.

Globalement, j'essaie d'éviter que DateTime1 soit Null et que DateTime2 soit nul.

Ma déclaration where ressemble à ceci:

 Where (DateTime1 is not null or DateTime2 is not null) 

Le seul problème est qu'il montre toujours où les deux sont des valeurs nulles. Quelqu'un sait pourquoi cela pourrait se produire ou comment le résoudre?

Merci

EDIT Full Query à la request de @Lamak

 ;With [CTE] As ( Select TH.ID ,AMT ,Reason ,EffDate ,DateReq ,CS_ID ,ROW_NUMBER() Over (Partition By ID Order By [pthPrimeKey] Desc) as [RN] From DateTime1Table as [MC] (nolock) Left Join History as [TH] (nolock) on [TH].[ID] = [MC].[ID] Left Join Trans as [SUB] (nolock) on [SUB].TransactionReasonCode = [TH].Reason Left Join Renew as [RM] (nolock) on [MC].ID = [RM].ID Where ([MC].[DateTime1] is not null or [RM].[DateTime2] is not null) And [PostingDate] = DATEADD(dd, datediff(dd, 1, GetDate()),0) ) SELECT [ID] ,[AMT] as [Earned] ,[Reason] as [Reason] ,[EffDate] as [Eff] ,[DateReq] as [Date_Cancel_Req] ,[pthUserId_Number] as [CSR] FROM [CTE] Where RN <= 1 

Ce qui suit permettra d'inclure des lignes si

  • seul DateTime1 a une valeur
  • seul DateTime2 a une valeur
  • les deux ont des valeurs

Il exclura les lignes où les deux valeurs sont NULL. Est-ce ce que vous cherchez? (J'ai essayé de suivre les conversations mais je me suis perdu, et j'aimerais que vous ayez une repro plus simple avec des exemples de données – je pense que le CTE et toutes les autres connections et logique éliminent vraiment le problème que vous rencontrez.)

 WHERE COALESCE([MC].[DateTime1], [RM].[DateTime2]) IS NOT NULL 

Cependant, puisque vous effectuez un LEFT OUTER JOIN , ceci peut appartenir à la clause ON pour [RM] au lieu de WHERE . Sinon, vous ne saurez pas si une ligne est exclue car la valeur d'une ligne correspondante était NULL ou parce qu'il n'y avait pas de ligne correspondante. Et peut-être que c'est ok, je pensais juste que je le mentionnerais.

MODIFIER

Bien sûr, cette clause fournit exactement les mêmes résultats que …

 WHERE ([MC].[DateTime1] is not null or [RM].[DateTime2] is not null) 

Voulez-vous une preuve?

 DECLARE @a TABLE(id INT, DateTime1 DATETIME); DECLARE @b TABLE(id INT, DateTime2 DATETIME); INSERT @a SELECT 1, '20120602' ; INSERT @b SELECT 1, NULL; INSERT @a SELECT 2, NULL ; INSERT @b SELECT 2, '20120605'; INSERT @a SELECT 3, '20120604' ; INSERT @b SELECT 3, '20120605'; INSERT @a SELECT 4, NULL ; INSERT @b SELECT 4, NULL; INSERT @a SELECT 5, '20120602' ; INSERT @b SELECT 9, NULL; INSERT @a SELECT 6, NULL ; INSERT @b SELECT 10, '20120605'; INSERT @a SELECT 7, '20120604' ; INSERT @b SELECT 11, '20120605'; INSERT @a SELECT 8, NULL ; INSERT @b SELECT 12, NULL; SELECT * FROM @a AS a LEFT OUTER JOIN @b AS b ON a.id = b.id WHERE COALESCE(a.DateTime1, b.DateTime2) IS NOT NULL; SELECT * FROM @a AS a LEFT OUTER JOIN @b AS b ON a.id = b.id WHERE a.DateTime1 IS NOT NULL OR b.DateTime2 IS NOT NULL; 

Les deux requêtes donnent:

 id DateTime1 id DateTime2 -- ---------- ---- ---------- 1 2012-06-02 1 NULL -- because left is not null 2 NULL 2 2012-06-05 -- because right is not null 3 2012-06-04 3 2012-06-05 -- because neither is null 5 2012-06-02 NULL NULL -- because of no match 7 2012-06-04 NULL NULL -- because of no match 

Donc, comme je l'ai suggéré dans le commentaire, si vous ne voyez pas les lignes que vous attendez, vous devez regarder d'autres parties de la requête. Si vous fournissez des exemples de données et les résultats souhaités, nous pouvons essayer de vous aider à les réduire. En l'état, je ne pense pas que nous en sachions assez sur votre schéma et vos données pour déterminer où se situe le problème.