Sql server 根据交易量为数据分配分数

Sql server 根据交易量为数据分配分数,sql-server,tsql,Sql Server,Tsql,我正在尝试实现一个查询,用于为成员分配分数,但无法实现 在下面的示例中,成员数是10,但我希望计数是动态的,我已经通过 SELECT COUNT (DISTINCT [Member No]) FROM Table 表结构: 在这个例子中 Member 1 - 5 Transactions Member 2 - 5 Transactions Member 3 - 10 Transactions Member 4 - 10 Transactions Member 5 - 100 Tran

我正在尝试实现一个查询,用于为成员分配分数,但无法实现

在下面的示例中,成员数是10,但我希望计数是动态的,我已经通过

SELECT COUNT (DISTINCT [Member No])
FROM Table
表结构:

在这个例子中

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

一种选择是使用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

在您的表中,没有事务列。在您的示例中,您没有提供这段时间内的交易数量。@Shivang我很乐意帮助您。我没有完全使用您的原始输出的原因是,将许多成员列在一行中看起来不好看,也不可读。但除此之外,我试着回答你的问题。
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