2016-05-19 5 views
1

私は現時点で苦労している質問があります。 私は本当にこの問題を解決する方法を知らない、それはとても簡単です。返信先のお客様のT-SQL検索

私には顧客IDと注文日があります。 私は2015年以前に物事を注文し、購入したものは過去10日間に何かを言う顧客を見せたいだけです。私はそのために少しテストテーブルを作成し

- それは2016年1月だと言うことができます: enter image description here

今私のニーズに合う[OK]を1月に、年間2010年に購入をした顧客1は、そこにある、私が欲しいです彼を示す。 しかし、顧客2は昨年12月に購入をしたので、彼は「帰ってきた」顧客ではなく、しばしば私のものを買う顧客です。私は彼を見せたくない。

私はこのような何かをしようと試みたが、それはうまくいきませんでした:

SELECT [Kunden_ID],Bestellung 
FROM [Immo].[dbo].[TEST] AS A 
WHERE (Bestellung >=DATEADD (day,-10,getdate()) 
AND Bestellung <= DATEADD (month,-12,getdate())) 

答えて

3

次の2つの別々のクエリを必要とします。最初の人は、過去10日間に何かを購入した顧客を見つけます。 2番目はが存在するクエリを使用して12か月以上前に購入した同じ顧客(IDを使用して結合する)を検索します。

はこれを試してみてください。これを行うには

SELECT [Kunden_ID],Bestellung 
FROM [Immo].[dbo].[TEST] AS A 
WHERE (Bestellung >=DATEADD (day,-10,getdate())) 
and exists (
select 1 
from [Immo].[dbo].[TEST] AS B 
where a.[Kunden_ID] = b.[Kunden_ID] 
AND b.Bestellung <= DATEADD (month,-12,getdate()) 
) 

もう一つの方法は、共通テーブル式(CTE)を使用しています。さまざまなクエリを見るのが少し簡単です。

With Get10Days as (
SELECT [Kunden_ID],Bestellung 
FROM [Immo].[dbo].[TEST] AS A 
WHERE (Bestellung >=DATEADD (day,-10,getdate())) 
) 


select b.Kunden_ID 
from [Immo].[dbo].[TEST] AS B 
join Get10Days as A on a.Kunden_ID = b.Kunden_ID 
where b.Bestellung <= DATEADD (month,-12,getdate()) 
0

私は@jabs答えを好きで、私はフィルタリングするためのもう一つの可能​​性を提供したいと考えています。

サブクエリ!

SELECT [Kunden_ID],Bestellung 
FROM [Immo].[dbo].[TEST] AS A 
WHERE (Bestellung >=DATEADD (day,-10,getdate()) 
AND [Kunden_ID] in 
--Subquery below 
    (SELECT [Kunden_ID] 
    FROM [Immo].[dbo].[TEST] AS B 
    AND Bestellung <= DATEADD (month,-12,getdate())) 

MSSQLのサポートされているバージョンについて話:Many peopleと、IN は、パフォーマンスの観点から、異なる存在することを主張したが、これは本当のないです。

ほんの数秒を取り、実際の実行計画を見て、彼らはまったく同じに扱われる(参加/インナーマージ結合)

screenshot1

screenshot2

あなたがまた私を見ることができますTOP 1など、などと試してみました。サポートされていない旧バージョンのMSSQLを使用している場合は、何か異なることがあります。

サイドノート:この2つの間にlogical differencesがあります。 EXISTSを使用している脳の場合は、他の脳の場合はINが理にかなっていますが、パフォーマンスとは何の関係もありません。

+1

これを処理する別の方法です。選択肢はたくさんあります。 – jabs

関連する問題