SQL滚动月销售额与最后一项购买

时间:2018-02-02 14:21:24

标签: mysql

我正在尝试从数据库中提取销售报告,其中包括在过去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个滚动的月份时间框架,并包括在此期间没有购买任何东西的客户。所以,我的问题是

  1. 如何创建每个客户每月销售额的列?我知道如何将它作为独立查询来实现每个月的计数,但我很清楚如何在同一个结果集中包含一个多月,更不用说与上述结果表集成了。我认为这与子查询有关(可能?),但这超出了我的联盟,所以我们会赞赏一些指示和方向。

  2. 如何从我到目前为止的结果表中获得每位客户的最新购买(如果根本没有购买,则为null)

1 个答案:

答案 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

希望这会对你有所帮助。