2009-09-03 7 views
1

私は過去3か月間に請求された顧客と顧客ベース全体の差異を解決しようとしています。私は、次のSQL私はまたCustomerCodeフィールドを持つ顧客テーブルになりますと比較することになるSQL Server 2000の2つのデータセットの相違

DECLARE @DateFrom AS DATETIME 
SET @DateFrom = 
    CONVERT(DATETIME, CAST(YEAR(GETDATE()) AS VARCHAR(4)) + 
    '-' + 
    CAST(MONTH(DATEADD(MONTH, -3, GETDATE())) AS VARCHAR(2)) + '-01', 120) 

DECLARE @DateTo AS DATETIME 
SET @DateTo = 
    CONVERT(DATETIME, CAST(YEAR(GETDATE()) AS VARCHAR(4)) + 
    '-' + 
    CAST(MONTH(GETDATE()) AS VARCHAR(2)) + '-01', 120) 

SELECT DISTINCT 
    i.CustomerCode 
FROM 
    Invoice AS i 
WHERE 
    (i.InvoiceDate > @DateFrom AND i.InvoiceDate < @DateTo) 

テーブルを使用して請求してきた顧客を計算することができました。

ありがとうございます!これを理解し、ちょうどここに、このメッセージを投稿するのは数分後、私は解決策を見つけしようとしている年齢を過ごした後

EDIT

。 NOT IN句を使用する!

SELECT 
    c.CustomerCode 
FROM 
    [Customer] AS c 
WHERE 
    c.CustomerCode NOT IN (
SELECT DISTINCT 
    i.CustomerCode 
FROM 
    [Invoice] AS i 
WHERE 
    (i.InvoiceDate >= @DateFrom AND i.InvoiceDate < @DateTo)) 

私のシナリオでは、これは管理スタジオでそれぞれテストしたときに以下に述べる手順が速く実行されているようです。

+2

と正確に何をしたいですか?過去3か月間に請求されていないすべての顧客のリスト?どのバージョンのSQL Serverを使用していますか? –

+0

まさにそれ。私はSQL Server 2000を使用しています。私が現在持っているものより優れたソリューションはありますか? – Malachi

+1

いいえ、私はSQL Server 2000では、それが得られるほど簡単だと思います。 –

答えて

3

あなたがあなたの日付の処理を改善することができます:00:00:00時間と開始日に私が使用し

WHERE i.InvoiceDate >= DATEADD(mm,-3,DATEADD(mm,DATEDIFF(mm,0,GETDATE()),0)) 
    AND i.InvoiceDate < DATEADD(mm,DATEDIFF(mm,0,GETDATE()),0) 

予告> =起動時に、あなたが不足している行を。

SELECT 
    c.CustomerCode 
FROM Customer    c 
    LEFT OUTER JOIN Invoice i ON c.CustomerCode=i.CustomerCode 
     AND i.InvoiceDate >= DATEADD(mm,-3,DATEADD(mm,DATEDIFF(mm,0,GETDATE()),0)) 
     AND i.InvoiceDate < DATEADD(mm,DATEDIFF(mm,0,GETDATE()),0) 
WHERE i.CustomerCode IS NULL 
+0

日付処理のヒントが良いです。 しかし、InvoiceDate範囲チェックがLEFT OUTER JOINのON句の一部であり、WHEREの一部ではないようにクエリを変更する必要があります。 – van

+0

@van、ええ、うん、それはどこでそれで動作しません、それはONの –

2

ある程度の期間中に課金されていない顧客を取得するには:過去3のフルヶ月以内に請求書を持っていなかったすべてのお客様が、あなたもそれをこのように書くことができます得るために

SELECT  c.CustomerCode 
FROM  [Customer] AS c 
LEFT JOIN [Invoice] AS i 
     ON c.CustomerCode = i.CustomerCode 
     AND i.InvoiceDate > @DateFrom AND i.InvoiceDate < @DateTo 
WHERE  i.CustomerCode IS NULL 

私は、変数を使用しないようにKMの提案で@DateFrom and @DateTo日付範囲チェックを置き換えますけれども。

+0

+1にある必要があります、訂正のおかげで! –

関連する問題