Sql server 根据交易量为数据分配分数
我正在尝试实现一个查询,用于为成员分配分数,但无法实现 在下面的示例中,成员数是10,但我希望计数是动态的,我已经通过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
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