2016-12-20 3 views
0

私は以下のクエリを書いています:質問を書いてスコアを与えます

過去90日間の取引の数をカウントしてください。 は新しいメンバー=(トランザクションは/日が メンバーであることなし)で平均することにこれが必要90

新メンバーがそのDateCreated今日の日付から0と90日の間にある一つです×:注意してください。

表の構造は:

Column Name   Datatype 
--------------------------------- 
Member_No   nvarchar(255) 
Order_No   int 
Transaction_Date datetime 
Net     money 
Date_Created  datetime 

また、最後のステップは、私はスコアを与える必要がトランザクションをカウントした後です。 `

Transaction count  Score 
     >8     5 
     6-8     4 
     4-6     3 
     2-4     2 
     0-2     1 

任意のクエリが

+0

これまでに何を試みましたか? – GurV

+0

スクリプトを添付してください。 –

+0

いくつかのサンプルデータを提供してください。 –

答えて

0

は、以下のコードは、あなたのために働くホープ場合は、私に教えてください:だからメンバーが持っている場合は、その後に続いて5

のスコアを与える8以上を数える範囲は、 (スキーマを持っていないので、テストされていません。)

;WITH RANKS AS 
(
    SELECT 0 AS FROM_TR, 2 AS TO_TR, 1 AS SCORE 
    UNION ALL 
    SELECT 3 AS FROM_TR, 4 AS TO_TR, 2 AS SCORE 
    UNION ALL 
    SELECT 5 AS FROM_TR, 6 AS TO_TR, 3 AS SCORE 
    UNION ALL 
    SELECT 7 AS FROM_TR, 8 AS TO_TR, 4 AS SCORE 
    UNION ALL 
    SELECT 9 AS FROM_TR, NULL AS TO_TR, 5 AS SCORE 

) 
, MEMBER_TRANS AS (
SELECT Member_No AS MEMBER_NO 
    ,Date_Created AS DATE_CREATED 
    ,COUNT(DISTINCT Order_No) ACTUAL_TRANSACT_COUNT 
    ,CASE 
     WHEN Date_Created BETWEEN DATEADD(DD, - 90, GETDATE()) 
       AND GETDATE() 
      THEN CAST(
      COUNT(DISTINCT Order_No)/DATEDIFF(DD, Date_Created, GETDATE()) * 90 
      AS INT) 
     ELSE COUNT(DISTINCT Order_No) 
     END AS TRANSACT_COUNT 
FROM TABLE1 
WHERE Transaction_Date BETWEEN DATEADD(DD, - 90, GETDATE()) 
     AND GETDATE() 
GROUP BY Member_No 
    ,Date_Created 
) 

SELECT MT.Member_No,MT.TRANSACT_COUNT, R.SCORE FROM MEMBER_TRANS MT 
INNER JOIN RANKS R ON MT.TRANSACT_COUNT BETWEEN R.FROM_TR 
AND isnull(R.TO_TR,MT.TRANSACT_COUNT) 

--Added Extra below code from your comments 

UNION ALL 

SELECT Member_No,COUNT(DISTINCT Order_No), 1 AS SCORE FROM TABLE1 
WHERE Transaction_Date < DATEADD(DD, - 90, GETDATE()) 
AND Transaction_Date NOT BETWEEN DATEADD(DD, - 90, GETDATE()) 
AND GETDATE() 
GROUP BY Member_No 
+0

この照会は、トランザクション日付が0-90のメンバーに対して機能します。メンバーがその外で取引した場合、スコア1を与えられるべきです。変更には何が必要ですか? – Shivang

+0

最後に余分なUNION ALLを追加しました。 @Shivang –

0

あなたrequirement.Pleaseあたりのクエリ以下のための出力のスナップショットを見つけるようなコードは、所望の結果を返します。 enter image description here

WITH Mycte 
AS 
(
Select Member_No,Case when DateDiff(dd,Date_Created,Getdate())>90 then 0 else 1 END AS New_Member 
, DateDiff(dd,Date_Created,Getdate()) AS DaysAsMember 
,Count(Order_No) TransactionCount from #Sample1 
group by Member_No,Date_Created 
) 
Select Member_No,Case when TransactionCount > 8 THEN 5 
     WHEN TransactionCount BETWEEN 6 AND 8 THEN 4 
     WHEN TransactionCount BETWEEN 4 AND 5 THEN 3 
     WHEN TransactionCount BETWEEN 3 AND 4 THEN 2 
     WHEN TransactionCount BETWEEN 0 AND 2 THEN 1 
     END 
     AS Score 
From Mycte 
+0

演算子の間は '> ='と '<='を参照します。そして2,4,6,8は、別の条件で与えられます。それは間違った結果を与えるかもしれない –

+1

@ShakeerMirzaは気づいてくれてありがとう...私はコードを更新しました。 –

関連する問題