2016-12-20 2 views
0

Ich versuche, eine Abfrage für Folgendes zu schreiben:eine Abfrage schreiben und eine Punktzahl geben

Zählen Sie die Anzahl der Transaktionen in den letzten 90 Tagen. Hinweis: Dies muss für neue Mitglieder ausgemittelt wird = (Anzahl der Transaktionen/Tag ist ein Mitglied) x 90

Neue Mitglieder sind derjenige, das Datecreated zwischen 0 und 90 Tagen nach dem heutigen Datum.

Tabellenstruktur:

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

Auch der letzte Schritt ist nach den Transaktionen zu zählen, ich brauche eine Punktzahl zu geben. Also, wenn ein Mitglied mehr als 8 zählen dann eine Punktzahl von 5 geben

Im Folgenden sind die Bereiche: `

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

Lassen Sie mich wissen, ob irgendwelche Anfragen

+0

Was haben Sie versucht, so weit? – GurV

+0

Bitte fügen Sie Ihr Skript bei. –

+0

Stellen Sie einige Beispieldaten zur Verfügung, so dass Ihnen jemand schnell helfen kann. –

Antwort

0

die folgende Code Hoffnung für Sie (nicht getestet, weil nicht-Schema hat.)

;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

Diese Abfrage funktioniert für ein Mitglied zwischen Transaktionsdaten von 0-90. Wenn ein Mitglied außerhalb davon gehandelt hat, sollte er eine Punktzahl von 1 erhalten. Welche Änderungen müssen vorgenommen werden? – Shivang

+0

Hinzugefügt Extra UNION ALL in der letzten für das, was Sie gefragt haben. @Shivang –

0

der Code wird das gewünschte Ergebnis zurück nach Ihrer requirement.Please für unter Abfrage die Snapshot der Ausgabe finden. 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

Zwischen Operator bezieht sich auf '> =' und '<='. Und 2,4,6,8 sind in verschiedenen Fallbedingungen gegeben. Es könnte falsche Ergebnisse geben –

+1

@ShakeerMirza danke für die Kenntnisnahme ... Ich habe den Code aktualisiert. –

Verwandte Themen