MYSQL内联视图查询(顶级客户)

时间:2013-03-23 22:39:16

标签: mysql sql groupwise-maximum

我尝试进行查询,以便在一个月内(从开始到现在每个月)都能看到谁是最佳客户。

现在我有了表格:

订单orderIDorderdatecustomerIDNetamounttaxtotalamount

订单orderlineIDorderIDprodIDquantityorderdate

客户firstname lastname zip creditcardtype等。)

我认为其他表格不一定在这里。

当然,有些顾客从未买过东西,而且顾客已经买了很多次。

现在我使用了这个查询:

    SELECT customerid, Sum(netamount) 
    FROM orders
    GROUP BY customerid limit 1000000;

现在我看到所有已购买的客户了。他们支付的总金额。

使用查询

    SELECT YEAR ( Orderdate ) Year ,
    MONTHNAME ( Orderdate ) Month ,
    COUNT(*) TotOrd ,
    FROM orders
    GROUP BY YEAR ( Orderdate ),
    MONTH ( Orderdate );

我得到一张表格,其中每一行都显示Yea r Month Total order(放置在该月份)。

我仍然希望看到一个月的最佳客户

我在互联网上搜索了很多但仍然无法找到我想要的东西(也许我只是用Google搜索错误)。我知道我至少需要一个内联视图,但仍然不知道如何实现它。

希望有人可以帮助我。

2 个答案:

答案 0 :(得分:0)

您需要加入数据以获得最佳客户。因此,首先计算每个月的最高金额,然后加入以获得该金额的客户:

select my.year, my.month, myc.customerid, myc.totord
from (select year, month, max(totord) as maxtotord
      from (SELECT YEAR ( Orderdate ) Year, MONTHNAME ( Orderdate ) Month, customerid, COUNT(*) TotOrd ,
            FROM orders
            GROUP BY YEAR ( Orderdate ), MONTH ( Orderdate ), customerid
           ) myc
      group by year, month
     ) my join
     (SELECT YEAR ( Orderdate ) Year, MONTHNAME ( Orderdate ) Month, customerid, COUNT(*) TotOrd ,
      FROM orders
      GROUP BY YEAR ( Orderdate ), MONTH ( Orderdate ), customerid, count(*) as totord
     ) myc
     on my.year = myc.year and my.month = myc.month and my.maxtotord = myc.totord

请注意,这是未经测试的,因此可能存在语法错误。

此外,如果有多个客户具有最大值,则会返回多个客户。

最后,这在几乎任何其他数据库中都要容易得多,因为现在大多数数据库都支持row_number()函数。

答案 1 :(得分:0)

这是一个小组最大的问题,但遗憾的是MySQL不支持窗口函数或CTE,所以这可能很麻烦。

SELECT s1.year,s1.month,s1.customerid,s1.totord FROM
(SELECT YEAR ( Orderdate ) Year ,
MONTHNAME ( Orderdate ) Month , 
customerid,
COUNT(*) TotOrd 
FROM orders
GROUP BY YEAR ( Orderdate ),
MONTH ( Orderdate ),customerid) as s1
LEFT JOIN
(SELECT YEAR ( Orderdate ) Year ,
MONTHNAME ( Orderdate ) Month , 
customerid,
COUNT(*) TotOrd 
FROM orders
GROUP BY YEAR ( Orderdate ),
MONTH ( Orderdate ),customerid) as s2
ON
s1.year=s2.year AND s1.month=s2.month AND s2.TorOrd>s1.TotOrd AND s1.customerid>s2.customerid
WHERE s2.customerid IS NULL;

如果是双打,则会返回ID较低的客户。