2016-04-19 7 views
0

各ユーザーが「MO1 + M01」というコードを使用して注文したユーザーの最新の最新のodrersを確認し、または365日に等しい。最新の注文日と最新の注文日を比較する

私の下のクエリは、オーバー除外するようだとは値を返しません:

注:電子メールの多くが原因小売アドホック取引にNULLまたは空白のいずれかです。

SELECT DISTINCT oh.[UID Email], c.[Offer], a2.[LatestOrderDate], a2.[OrderCount], b2.[SecondOrderDate], b2.[SecondOrderCount], 
DATEDIFF(DAY,a2.[LatestOrderDate],b2.[SecondOrderDate]) Gap_Days 
FROM [RBI Order Header] oh 

LEFT JOIN 
(SELECT DISTINCT [UID Email], [Order Date] [LatestOrderDate], [OrderCount] 
FROM (SELECT ROW_NUMBER() 
    OVER(ORDER BY [Contact Order Count] DESC) AS 'OrderCount', 
    [UID Email], 
    [Order Date] 
    FROM [RBI Order Header] 
    WHERE [UID Email] LIKE '%@%') a 
WHERE OrderCount = 1 
GROUP BY [UID Email], [Order Date], [OrderCount]) a2 
ON oh.[UID Email] = a2.[UID Email] 

LEFT JOIN 
(SELECT DISTINCT [UID Email], [Order Date] [SecondOrderDate], [SecondOrderCount] 
FROM (SELECT ROW_NUMBER() 
    OVER(ORDER BY [Contact Order Count] DESC) AS 'SecondOrderCount', 
    [UID Email], 
    [Order Date] 
    FROM [RBI Order Header] 
    WHERE [UID Email] LIKE '%@%') b 
WHERE SecondOrderCount = 2 
GROUP BY [UID Email], [Order Date], [SecondOrderCount]) b2 
ON oh.[UID Email] = b2.[UID Email] 

LEFT JOIN 
(SELECT DISTINCT LEFT(dl.[Offer No_],3) [Offer], dl.[Order No_] FROM [Rapha].dbo. [Staging Discount Line] dl 
WHERE (dl.[Offer No_] LIKE 'MO1%' OR 
    dl.[Offer No_] LIKE 'M01%')) c 
ON oh.[Posted Document No_]=c.[Order No_] COLLATE Latin1_General_100_CI_AI 

WHERE DATEDIFF(DAY,a2.[LatestOrderDate],b2.[SecondOrderDate]) >= 365 

GROUP BY oh.[UID Email], a2.[LatestOrderDate], b2.[SecondOrderDate], [Offer], DATEDIFF(DAY,a2.[LatestOrderDate],b2.[SecondOrderDate]), a2.[OrderCount], b2.[SecondOrderCount] 
ORDER BY Gap_Days 
+1

あなたのクエリを使用する方法を実証するために必要以上の方法より複雑なようだ試してみました。しかし、サンプルデータと望みの結果がなければ、本当に望むものを見つけ出すことはできません。 –

答えて

0

最後のwhere句を取り出してみてください。

WHERE DATEDIFF(DAY, a2.[LatestOrderDate], b2.[SecondOrderDate]) >= 365 

今すぐデータを返しますか?

電子メールの多くはNULLまたは空白のいずれかであり、このフィールドはあなたが参加しているものであると言いますが、最近3つの論理を読み上げていますか?

0

クエリが複雑すぎてデバッグや間違って書き込まれません.CTEを使用してクエリを書き換えてください。

第2に、あなたは非常に多くの異なるグループを持っています。明らかに、テーブルに実際のデータがどのように埋め込まれていて、別個の根本原因を見つける必要があるかを確認する必要があります。私のクエリが正確ではありませんされて

、私はちょうどCTE

;With CTE as 
(
    SELECT ROW_NUMBER() 
    OVER(ORDER BY [Contact Order Count] DESC) AS rn, 
    [UID Email], 
    [Order Date] 
    FROM [RBI Order Header] 
    WHERE [UID Email] is not null 
) 
,CTE1 AS 
(SELECT oh.[UID Email], c.[Offer], a2.[Order Date] as [LatestOrderDate], a2.rn as [OrderCount], b2.[Order Date] as [SecondOrderDate], b2.rn as [SecondOrderCount], 
DATEDIFF(DAY,a2.[Order Date],b2.[Order Date]) Gap_Days 
FROM [RBI Order Header] oh 
LEFT JOIN CTE a2 ON oh.[UID Email] = a2.[UID Email] 
LEFT JOIN CTE b2 ON oh.[UID Email] = b2.[UID Email] 
LEFT JOIN [Rapha].dbo. [Staging Discount Line] dl ON oh.[Posted Document No_]=d1.[Order No_] COLLATE Latin1_General_100_CI_AI 
where a2.rn=1 and b2.rn=1 
AND (dl.[Offer No_] LIKE 'MO1%' OR dl.[Offer No_] LIKE 'M01%') 
) 

-- select * from cte //you can check here if you are getting correct output without using distinct 
select * from CTE1 where Gap_Days >= 365 
関連する問題