我不是 MySQL 的专家,这一点在今天已被证明是显而易见的,但我需要帮助按销售额对用户进行排序。
我有两张 table 。一个叫用户
+------------------------+
+ id | fname | lname +
+------------------------+
+ 1 | bob | french +
+ 2 | fred | smith +
+ 3 | ted | nugent +
+ 4 | kyle | frank +
+------------------------+
还有一个是销售
+------------------------------------------------------------+
+ id | date | commission | lister | seller +
+------------------------------------------------------------+
+ 1 | 2017-11-01 | 2200 | 2 | 2 +
+ 2 | 2018-01-15 | 1800 | 1 | 1 +
+ 3 | 2017-11-07 | 3600 | 2 | 1 +
+ 4 | 2017-11-30 | 1252 | 4 | 1 +
+------------------------------------------------------------+
佣金由发布者和卖家按 50/50 分配。 lister 和 seller 列对应于用户 id
我需要找到两件事。
A) 一个人(例如 Bob French)本月销售额的佣金总和排名
所以 Bob 应该拥有 50% 的销售额 #3 和 50% 的销售额 #4。
第 2 次促销事件不在本月
所以销售 #3 (1800) 的一半和销售 #3 (626) 的一半是 2426
这个月的排名应该是
- Fred @ 4000 总佣金
- Bob @ 2426 总佣金
- Kyle @ 626 总佣金
- Ted @ 0 总佣金
我需要返回本月(本例中为 11 月)USER(本例中为 bob)的 RANK(本例中为 2)和 TOTAL COMMISSION(本例中为 2426)
B) 我需要在不同的语句中显示整个上表(以便主管看到每个人的排名。用户只能匿名看到他们的排名。
两者可能是相同的 SQL 查询,然后我只是从结果集中按 id 提取用户,除非有更有效的方法。
我尝试过的
SELECT x.id, x.fname, x.lname, y.commission,
FIND_IN_SET( commission , (
SELECT GROUP_CONCAT( commission ORDER BY commission DESC )
FROM sales
) ) AS rank
FROM users x
JOIN sales y ON x.id IN (lister, seller)
ORDER BY rank ASC
这是可行的,但它不限于月份。我试过添加
WHERE (date between DATE_FORMAT(NOW() ,'%Y-%m-01') AND NOW() )
但它似乎没有效果,因为我尝试将日期限制在 2010 年,结果无论如何都回来了。
此外,上面的查询返回的是获得单一最高佣金的人的排名,而不是他们佣金的总和。
请帮忙。
最佳答案
您可以使用 UNION ALL
:
select x.id, x.name, sum(commision) as commision from
(select a.date as date, b.id as id, b.fname as name, a.commision/2 as commision
from sales a join users b
on a.lister = b.id
union all
select a.date as date, b.id as id, b.fname as name, a.commision/2 as commision
from sales a join users b
on a.seller = b.id) as x
where x.date between '2017-11-01' and '2017-11-30'
group by x.id, x.name
这里是 fiddle :http://sqlfiddle.com/#!9/8ae69a/7
对于您的过滤器 WHERE
和排序,您可以添加:
select x.id, x.name, sum(commision) as commision from
(select a.date as date, b.id as id, b.fname as name, a.commision/2 as commision
from sales a join users b
on a.lister = b.id
union all
select a.date as date, b.id as id, b.fname as name, a.commision/2 as commision
from sales a join users b
on a.seller = b.id) as x
where (x.date between DATE_FORMAT(NOW() ,'%Y-%m-01') AND NOW() )
group by x.id, x.name
order by commision
- 编辑-
添加等级:( fiddle :http://sqlfiddle.com/#!9/8ae69a/30)
SET @rank = 0;
SELECT @rank := @rank + 1 AS rank,
y.id,
y.name,
y.commision
FROM (SELECT x.id,
x.name,
Sum(commision) AS commision
FROM (SELECT a.date AS date,
b.id AS id,
b.fname AS name,
a.commision / 2 AS commision
FROM sales a
JOIN users b
ON a.lister = b.id
UNION ALL
SELECT a.date AS date,
b.id AS id,
b.fname AS name,
a.commision / 2 AS commision
FROM sales a
JOIN users b
ON a.seller = b.id) AS x
WHERE ( x.date BETWEEN Date_format(Now(), '%Y-%m-01') AND Now() )
GROUP BY x.id,
x.name
ORDER BY x.commision) AS y
关于MYSQL根据性能获取用户排名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47193437/