1

SQLServer2005を使用します。

データは2つの別々のテーブルにあり、書き込み権限しか与えられていません。

データは次のようになります。

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

私がやろうとしているのは、DateTime1とDateTime2に値が含まれ、DateTime1に日付が含まれ、DateTime2がNULL、DateTime1がNULL、DateTime2に値が含まれる値をカウントできるようにすることです。

全体的に、DateTime1がNullでDateTime2がnullになるのを避けようとしています。

私のwhereステートメントは次のようになります。

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

唯一の問題は、両方がnull値である場所がまだ表示されていることです。なぜこれが起こっているのか、それを解決する方法を知っている人はいますか?

ありがとう

@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
4

1 に答える 1

6

次の場合、行を含めることができます

  • DateTime1のみに値があります
  • DateTime2のみに値があります
  • 両方に値があります

両方の値がNULLである行は除外されます。それはあなたが求めているものですか?(私は会話をフォローしようとしましたが、迷子になりました。サンプルデータを使用して、より簡単な再現ができればと思います。CTEと他のすべての結合およびロジックは、実際に発生している問題を実際に取り除くと思います。)

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

ただし、を実行しているため、これはの代わりにの句にLEFT OUTER JOIN属している可能性があります。そうしないと、一致する行の値がNULLであったため、または一致する行がなかったために行が除外されているかどうかがわかりません。そして多分それは大丈夫です、私がそれについて言及すると思っただけです。ON[RM]WHERE

編集

もちろん、その句は...とまったく同じ結果を提供します。

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

証拠が欲しいですか?

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;

どちらのクエリも次のようになります。

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

したがって、コメントで提案したように、期待する行が表示されない場合は、クエリの他の部分を確認する必要があります。サンプルデータと望ましい結果を提供していただければ、それを絞り込むお手伝いをいたします。現状では、問題がどこにあるかを判断するために、スキーマとデータについて十分に理解していないと思います。

于 2012-06-12T22:43:20.580 に答える