您的老板喜欢您在第一个项目中编写的pivot查询。他让会计看了看,她说她想看一个类似的问题,但在过去的30天,60天,90天的销售。
MySQL有一个函数,可以用来比较两个日期-DATEDIFF:
从采购中选择DATEDIFF(now(),DateOfPurchase)
MySQL从“now”中减去购买日期,并返回一个整数,表示这两个日期之间的天数。
您可以使用此函数编写会计请求的透视查询。结果可能类似于以下内容:

 Album         D30  D60  D90

 OK Computer    2    5    3
 Sea Change     8    6    2

注意,每个时间段都有单独的数据。D60数据应该是31到60天前的采购数据,而不是过去60天内的所有采购数据。类似地,D90数据应该是61到90天前的购买数据,而不是过去90天内购买的所有数据。
不要创建单独的表或视图。
将查询另存为dba1lesson10project2.sql,然后提交该项目。
我已将采购数据输入到相隔30到60天和90天的采购表中。
我的桌子看起来像
 Customer ID     DateOfPurchase     SongID

     1              2007-03-31        3
     3              2007-06-30        4
     4              2007-09-30        4
     5              2007-12-31        5
     2              2013-08-21        2
     4              2013-07-22        5
     5              2013-06-22        1

所以,我只会有一个购买每30天期间显示。
我以前的项目是显示每季度的购买量,这就是为什么2007年的数据在那里。
我已经和我的老师谈过了,他说我的代码和我上一个项目的代码很相似。
我试过了
 SELECT DATEDIFF(now(), DateOfPurchase),
 SUM(CASE WHEN DateOfPurchase <= 30 THEN 1 ELSE 0 END) AS 'D30',
 SUM(CASE WHEN DateOfPurchase >= 31 AND DateOfPurchase = 60 THEN 1 ELSE 0 END) AS 'D60',
 SUM(CASE WHEN DateOfPurchase >= 61 AND DateOfPurchase = 90 THEN 1 ELSE 0 END) AS 'D90'
 FROM Purchases;

返回:
 DATEDIFF(now(), DateOfPurchase   D30   D60   D90

              2365                 0     0     0

我尝试了这段代码的几个不同变体,它们几乎返回了相同的结果。除了第一列中的数字相同之外。
下面是我上一个项目的代码,如果有帮助的话。
 SELECT A.Title,
 SUM(CASE WHEN QUARTER(DateOfPurchase) = 1 THEN 1 ELSE 0 END) AS 'Q1',
 SUM(CASE WHEN QUARTER(DateOfPurchase) = 2 THEN 1 ELSE 0 END) AS 'Q2',
 SUM(CASE WHEN QUARTER(DateOfPurchase) = 3 THEN 1 ELSE 0 END) AS 'Q3',
 SUM(CASE WHEN QUARTER(DateOfPurchase) = 4 THEN 1 ELSE 0 END) AS 'Q4'
 FROM Albums AS A
 INNER JOIN Songs AS S
 ON A.AlbumID = S.AlbumID
 INNER JOIN Purchases as P
 ON S.SongID = P.SongID
 GROUP BY A.Title;

我也知道我还必须为这个项目做表连接。我只是想在这之前得到正确的D30和D90输出。

最佳答案

你想要这样的东西

SELECT SUM(CASE WHEN DATEDIFF(CURDATE(), DateOfPurchase)
                     BETWEEN  0 AND 30 THEN 1 ELSE 0 END) D30,
       SUM(CASE WHEN DATEDIFF(CURDATE(), DateOfPurchase)
                     BETWEEN 31 AND 60 THEN 1 ELSE 0 END) D60,
       SUM(CASE WHEN DATEDIFF(CURDATE(), DateOfPurchase)
                     BETWEEN 61 AND 90 THEN 1 ELSE 0 END) D90
  FROM Purchase
 WHERE DateOfPurchase BETWEEN CURDATE() - INTERVAL 90 DAY AND CURDATE()

注意:由于当前数据的轴心旋转时间仅为90天,因此最好使用WHERE子句过滤掉所有其他数据,并以便于索引的方式进行操作。
样本输出:
|D30 | D60 | D90|
|-----|-----|-----|
|1 | 1 | 1|
这里是SQLFiddle演示

10-07 20:24