我正在尝试从数据库中提取销售报告,其中包括在过去3个月内销售给每位客户的商品数量,以及在同一时期内购买的最新商品的描述。
数据库有以下两个表:
客户表:
+---------+--------------+ | CID | CustName | +---------+--------------+ | 001 | John | | 002 | Marty | | 003 | Roger | +---------+--------------+
销售表:
+---------+--------------+-------------+------------+ | CID | Make | Model | PurchDate | +---------+--------------+-------------+------------+ | 001 | Ford | Focus | 2018-02-02 | | 001 | Dodge | Viper | 2018-01-20 | | 001 | Ferrari | 512 | 2018-01-15 | | 001 | BMW | M3 | 2017-12-10 | | 001 | Tesla | S | 2017-11-05 | | 002 | Honda | Civic | 2017-12-18 | +---------+--------------+-------------+------------+
因此,假设我们目前在2018年2月,例如,如果我运行查询,我应该得到以下结果:
+------------+------+------+------+-------------+--------+---------+ | CustName | -1 | -2 | -3 | LastPurch | Make | Model | +------------+------+------+------+-------------+--------+---------+ | John | 2 | 1 | 1 | 2018-01-20 | Dodge | Viper | | Marty | 0 | 1 | 0 | 2017-12-18 | Honda | Civic | | Roger | 0 | 0 | 0 | null | null | null | +------------+------+------+------+-------------+--------+---------+
其中第-1列包含1月份销售给客户的商品数量, - 2月份销售的商品数量,等等,品牌和型号列包含该客户最近购买的详细信息。请注意,如果客户在报告的时间范围内未进行购买,则其名称仍会显示为0 / null值。
编辑: 我没有提到我到目前为止所做的事情,为了读者的时间而将问题缩短。 但是,由于这导致一些人认为我正在试图卸下我的工作,让我解释一下到目前为止。
我提出了以下查询(Fiddle):
SELECT Customers.CustName AS 'Customer', Sales.PurchDate AS 'Date of
Purchase', Sales.Make AS 'Make', Sales.model AS 'Model'
FROM Customers LEFT OUTER JOIN Sales
ON Customers.CID = sales.CID AND Sales.PurchDate >=
adddate(adddate(last_day(curdate()), INTERVAL 1 DAY), INTERVAL -4 MONTH)
ORDER BY CustName ASC, PurchDate DESC
这给出了以下结果:
+------------+------------------+--------+--------+ | Customer | Date of Purchase | Make | Model | +------------+------------------+--------+--------+ | John | 2018-02-02 | Ford | Focus | | John | 2018-01-20 | Dodge | Viper | | John | 2018-01-15 | Ferrari| 512 | | John | 2017-12-10 | BMW | M3 | | John | 2017-11-05 | Tesla | S | | Marty | 2017-12-18 | Honda | Civic | | Roger | null | null | null | +------------+------------------+--------+--------+
这是为了满足要求,因为它显示了3个滚动的月份时间框架,并包括在此期间没有购买任何东西的客户。所以,我的问题是:
如何创建每个客户每月销售额的列?我知道如何将它作为独立查询来实现每个月的计数,但我很清楚如何在同一个结果集中包含一个多月,更不用说与上述结果表集成了。我认为这与子查询有关(可能?),但这超出了我的联盟,所以我们会赞赏一些指示和方向。
如何从我到目前为止的结果表中获得每位客户的最新购买(如果根本没有购买,则为null)
答案 0 :(得分:-1)
你可以尝试这样的事情 -
SELECT C.CustName
,COUNT(CASE WHEN MONTH(CURRDATE)-1 = MONTH(PurchDate) THEN 1 ELSE 0 END) -1
,COUNT(CASE WHEN MONTH(CURRDATE)-2 = MONTH(PurchDate) THEN 1 ELSE 0 END) -2
,COUNT(CASE WHEN MONTH(CURRDATE)-3 = MONTH(PurchDate) THEN 1 ELSE 0 END) -3
,MAX(PurchDate)
,Make
,Model
FROM Customers C
INNER JOIN Sales S ON C.CID = S.SID
GROUP BY C.CustName, Make, Model
希望这会对你有所帮助。