DATEDIFF显示过去30天,60天和90天的购买情况

时间:2013-09-20 22:03:37

标签: mysql join pivot datediff

您的老板喜欢您在第一个项目中编写的数据透视查询。他向会计师展示,她说她希望看到类似的查询,但是在过去的30,60和90天都有销售。

MySQL有一个可用于比较两个日期的函数 - DATEDIFF: SELECT DATEDIFF(now(),DateOfPurchase)FROM Purchases MySQL从“now”中减去DateOfPurchase并返回一个整数,表示这两个日期之间的天数。

您可以使用此功能编写会计的请求透视查询。结果可能类似于以下内容:

 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 D60和D90获得正确的输出。

1 个答案:

答案 0 :(得分:1)

你想要这样的东西

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子句过滤掉所有其他内容,并以索引友好的方式进行。< / p>

示例输出:

| D30 | D60 | D90 |
|-----|-----|-----|
|   1 |   1 |   1 |

这是 SQLFiddle 演示