2016-12-14 61 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

在你的表中,沒有'Transaction'列。在你的例子中,你沒有提供在這段時間內交易的數量。 – DVT

回答

1

一種選擇是使用CTE並計算每個成員的五分位數排名。對很多子查詢抱歉,但它是將每個成員分成五分位數的最簡潔的方式。

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我很樂意幫助你。我之所以沒有使用原始輸出的原因是因爲它看起來不好(或不可讀),因此許多成員列在一行中。但除此之外,我試圖按照你的問題。 –