簡體   English   中英

DATEDIFF顯示最近30、60和90天的購買情況

[英]DATEDIFF showing purchases from the last 30, 60, and 90 days

您的老板喜歡您在第一個項目中編寫的樞軸查詢。 他向會計師展示,她說她希望看到類似的查詢,但是過去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的正確輸出。

你想要這樣的東西

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演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM