2016-12-14 6 views
1

メンバーにスコアを割り当てるクエリを実装しようとしていますが、実行できません。以下の例ではここで 取引金額に基づいてデータにスコアを割り当てます。

は、メンバーの数は10ですが、私はカウントは動的なものにしたいと私はやったこと

SELECT COUNT (DISTINCT [Member No]) 
FROM Table 

表構造を通して:

MemberNo nvarchar(255) 
TransactionDate datetime 
SalesNumber int 
SalesAmount money 
DateCreated datetime 

この例では、

Member 1 - 5 Transactions 
Member 2 - 5 Transactions 
Member 3 - 10 Transactions 
Member 4 - 10 Transactions 
Member 5 - 100 Transactions 
Member 6 - 100 Transactions 
Member 7 - 15 Transactions 
Member 8 - 15 Transactions 
Member 9 - 2 Transactions 
Member 10 - 2 Transactions 

が表示されます。

Top 20 % = Member 5 and Member 6. They will each get a Score = 5 
Next 20 % = Member 7 and Member 8. They will each get a Score = 4 
Next 20% = Member 3 and Member 4. They will each get a Score = 3 
Next 20% = Member 1 and Member 2. They will get a Score = 2 
Last 20% = Member 9 and Member 10. They will get a Score = 1 
+0

テーブルには、[トランザクション]列はありません。あなたの例では、あなたはその期間中に取引の数を提供しませんでした。 – DVT

答えて

1

1つのオプションは、CTEを使用して、各メンバーの5分位の順位を計算することです。非常に多くのサブクエリにお詫びしますが、すべてのメンバーを5分音符にまとめる最もクリーンな方法でした。

WITH cte AS (
    SELECT [Member No] AS memberNo, 
      COUNT (*) AS memberCount 
    FROM Table 
    GROUP BY [Member No] 
) 
SELECT CASE WHEN t.rank < 0.2 THEN "first quintile" 
      WHEN t.rank >= 0.2 AND t.rank < 0.4 THEN "second quintile" 
      WHEN t.rank >= 0.4 AND t.rank < 0.6 THEN "third quintile" 
      WHEN t.rank >= 0.6 AND t.rank < 0.8 THEN "fourth quintile" 
      ELSE "fifth quintile" 
     END AS quartile, 
     t.memberNo, 
     t.memberCount 
FROM 
(
    SELECT t.memberNo, 
      t.memberCount, 
      CAST(t.rn AS FLOAT)/CAST((SELECT COUNT(*) FROM cte) AS FLOAT) AS rank 
    FROM 
    (
     SELECT memberNo, 
       memberCount, 
       ROW_NUMBER() OVER (ORDER BY memberCount DESC) AS rn 
     FROM cte 
    ) t 
) t 
ORDER BY t.memberCount DESC 
+1

これに感謝します!その完璧に動作します。 – Shivang

+0

@ Shivang私はあなたを助けてうれしいです。なぜなら、元の出力をそのまま出力していないのは、多くのメンバーが1行に表示されるように見えない(または判読できない)からです。しかし、これ以外にも、私はあなたの質問に従いました。 –

関連する問題