简体   繁体   English

MySQL:用 COUNT() 对总金额进行排名

[英]MySQL: Rank the total total amount with COUNT()

Edit: I want to rank with COUNT()编辑:我想用 COUNT() 排名

I've made a View with every order a customer made.我对客户下的每个订单都做了一个视图。 In the next step I wrote a query to calculate the total amount a customer purchased.在下一步中,我编写了一个查询来计算客户购买的总金额。 Now I want to rank the customers, based on their total purchase.现在我想根据客户的总购买量对客户进行排名。

I wrote this query:我写了这个查询:

SELECT u.m_name, SUM(u.num * u.price) AS total,
(SELECT COUNT(*)
FROM v_sales AS x
WHERE x.m_id = u.m_id
AND (SELECT SUM(s1.num * s1.price) FROM v_sales AS s1 WHERE s1.m_id = x.m_id)
>
(SELECT SUM(s2.num * s2.price) FROM v_sales AS s2 WHERE s2.m_id = x.m_id)
) + 1 AS Rank
FROM v_sales AS u
GROUP BY u.m_id;

But the results are not the expected ones:但结果不是预期的:

# m_name   total   Rank
川島智弘    2620    1
河田英毅    0       1
山田忠明    15420   1
永峰弘万    500     1
永山智広    380     1

I need the following output:我需要以下 output:

# m_name    total   Rank 
川島智弘     2620    2
河田英毅     0       5
山田忠明     15420   1
永峰弘万     500     3
永山智広     380     4

Has someone an idea what I did wrong?有人知道我做错了什么吗? It would be also helpful if someone could explain why my query doesn't work.如果有人能解释为什么我的查询不起作用,那也会很有帮助。 Here is a Fiddle这是一个小提琴

Thank you谢谢

You can use the RANK function in MariaDB 10.4.您可以在 MariaDB 10.4 中使用RANK function。

SELECT m_name, SUM(num * price) AS total,
 RANK() OVER(ORDER BY SUM(num * price) DESC)
FROM v_sales
GROUP BY m_id;

Fiddle 小提琴

No window function:否 window function:

SELECT t1.m_name,MAX(t1.total),COUNT(t2.m_name)+1 as RANK
FROM
(SELECT m_name, SUM(num * price) AS total FROM
v_sales
GROUP BY m_id) t1
LEFT JOIN
(SELECT m_name, SUM(num * price) AS total FROM
v_sales
GROUP BY m_id) t2
ON t1.total<t2.total
GROUP BY t1.m_name
ORDER BY 3

Fiddle 小提琴

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM