Mysql 每月销售额最高的客户名称

Mysql 每月销售额最高的客户名称,mysql,sql,greatest-n-per-group,Mysql,Sql,Greatest N Per Group,我有一个sales(销售)表,从中我使用 select monthname(date),sum(amt_c),MAX(amt_c) from sales where year(date)= year(now()) group by monthname(date) ; 我还想选择购买量最高的客户,即对应最大金额的客户 金额是客户完成的购买,一种方式是过滤连接: select filter.mn , filter.sum_sale

我有一个sales(销售)表,从中我使用

        select monthname(date),sum(amt_c),MAX(amt_c) 
        from sales where  year(date)= year(now())
        group by monthname(date) ;
我还想选择购买量最高的客户,即对应最大金额的客户


金额是客户完成的购买,

一种方式是过滤连接:

select  filter.mn 
,       filter.sum_sales
,       filter.max_sales
,       sales.cust
from    (
        select  monthname(date) as mn
        ,       sum(amt_c) as sum_sales
        ,       max(amt_c) as max_sales
        from    sales
        where   year(date) = year(now())
        group by
                mn
        ) filter
join    sales
on      monthname(sales.date) = filter.mn
        and sales.amt_c = filter.max_sales
有关更多方法,请浏览标记

这与Andomar的答案类似,但它提供了以下好处:

如果您的日期字段已编制索引,则上面的查询将使用该索引。对于应用了函数的日期字段,不应该有条件。MySQL不支持基于函数的索引,因此yeardate不被索引是一个已知的事实。然而,日期可以被索引

这会按月份1-12对结果进行排序,但会显示月份名称

如果相同的2+个客户被捆绑在一起,这将列出所有客户,并仅显示当月的一行。否则,在平局的情况下,一个月内可能会有2行、3行、4行以上的数据。这是通过MySQL的GROUP_CONCAT函数实现的


表中的客户字段名是什么?对不起,我忘了提到,客户字段名是!!!这工作起来很顺利。谢谢你,伙计。请您简单解释一下它是如何工作的。如果我要求的太多,很抱歉。这不会利用日期字段上的索引,并且会在数月内重复行,其中金额列在2+个客户之间。@CleanX:join或internal join只返回on条件在左行和右行之间找到匹配的行右手边的桌子。因此,可以将联接用作筛选器。maxcase。。。构造是进行旋转的一种方法。您可以在标记中找到更多示例。内部查询中的order by没有用处。销售的加入应包括月份。而且没有数据库使用索引来搜索一整年的范围,表查找使得这一点令人望而却步expensive@Andomar这是一个错误,刚刚修复。但是我不明白为什么您会认为日期字段上的索引没有好处。数据库只会在SQL Server需要少量行(大约100行)时使用索引。对于更多的行,从索引到表查找或rid查找的成本太高。@BrianDeMilia我无法使用您的查询获取计数,countamt_c不是possible@CleanX什么意思?如果你也想要的话,我只是将计数添加到选择列表中。否则,请说明为什么不可能。您是否遇到语法错误,返回的计数是否与预期的不符,等等。
select v.monthname,
       v.sum_amt_c,
       v.max_amt_c,
       count(s.amt_c) as num_of_amounts,
       group_concat(s.cust) as customers
  from (select monthname(date) as monthname,
               sum(amt_c) as sum_amt_c,
               max(amt_c) as max_amt_c
          from sales
         where date between concat(year(now()), '-01-01') and concat(year(now()), '-12-31')
         group by monthname(date)) v
  join sales s
    on v.max_amt_c = s.amt_c
   and v.monthname = monthname(s.date)
   and s.date between concat(year(now()), '-01-01') and concat(year(now()), '-12-31')
 group by v.monthname, v.sum_amt_c, v.max_amt_c
 order by month(s.date)