0

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

现在我有桌子:

订单( orderID, orderdate, customerID, Netamount, tax, totalamount)

排序线( orderlineID, orderID, prodID, quantity, orderdate)

客户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 );

我得到一个表格,其中每一行都显示了Year Month Total order(放在那个月)。

我还是想看看一个月的顶级客户

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

希望有人可以在这里帮助我。

4

2 回答 2

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 的客户。

于 2013-03-23T22:56:29.733 回答
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()功能。

于 2013-03-23T22:46:48.903 回答