我尝试进行查询,以便在一个月内(从开始到现在每个月)都能看到谁是最佳客户。
现在我有了表格:
订单(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 );
我得到一张表格,其中每一行都显示Yea
r Month
Total order
(放置在该月份)。
我仍然希望看到一个月的最佳客户。
我在互联网上搜索了很多但仍然无法找到我想要的东西(也许我只是用Google搜索错误)。我知道我至少需要一个内联视图,但仍然不知道如何实现它。
希望有人可以帮助我。
答案 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较低的客户。