簡體   English   中英

獲取兩個日期之間每個月的查詢結果

[英]Get query result of every month between two dates

創建表鏈接: https : //drive.google.com/file/d/1EEqpW2Y8UkplfQcp_fw0j2byXAxBQXOW/view?usp=sharing

我有一個查詢

SELECT 
    DATE_FORMAT(seized_date,'%Y-%m') as 'Seized Date',
    sum(case when seized_remarks = 'Temporary Seized' then 1 else 0 end) AS seized,
    sum(case when (DATE_FORMAT(release_date, '%Y-%m') BETWEEN '2021-01' AND '2021-07') then 1 else 0 end) AS released,
    sum(case when (DATE_FORMAT(stock_return_date, '%Y-%m') BETWEEN '2021-01' AND '2021-07') then 1 else 0 end) AS stock_return
FROM mahindra
where 
(DATE_FORMAT(seized_date, '%Y-%m') BETWEEN '2021-01' AND '2021-07')
GROUP BY DATE_FORMAT(seized_date,'%Y-%m')


結果如下

Date    Seized  Release Stock Return
2021-01    1      0         0
2021-03    1      0         0
2021-04    1      0         0
2021-05    5      1         0
2021-06    6      0         1
2021-07    2      0         0

在這里,我沒有得到 2021 年 2 月的結果。我想得到這兩個日期之間所有月份的結果,即使查獲日期不存在

看起來你需要類似的東西

SELECT 
    dates.`Seized Date`,
    COALESCE(SUM(mahindra.seized_remarks = 'Temporary Seized'), 0) AS seized,
    COALESCE(COUNT(mahindra.release_date), 0) AS released,
    COALESCE(COUNT(mahindra.stock_return_date), 0) AS stock_return
FROM ( SELECT '2021-01' `Seized Date` UNION ALL
       SELECT '2021-02' UNION ALL
       SELECT '2021-03' UNION ALL
       SELECT '2021-04' UNION ALL
       SELECT '2021-05' UNION ALL
       SELECT '2021-06' UNION ALL
       SELECT '2021-07' ) dates
LEFT JOIN mahindra ON DATE_FORMAT(mahindra.seized_date, '%Y-%m') = dates.`Seized Date`
GROUP BY dates.`Seized Date`

正如@Akina 所說,如果您的表中任何地方都不存在seized_date值,您就不能指望它會出現在您的結果中。 您需要創建一個包含所有必需日期的列,然后您可以執行諸如對該列執行連接之類的操作。

這是我如何做的一個例子。

 SELECT  TO_CHAR(DATEADD('MONTH', -n, (CURRENT_DATE+1)),'YYYY-MM') AS seized_date
   FROM (
        SELECT ROW_NUMBER() OVER () AS n 
        FROM mahindra LIMIT 10
        ) 
   ORDER BY seized_date DESC

這將創建以下輸出。

在此處輸入圖片說明

代碼說明:

內部查詢基於窗口函數。 窗口函數本身很簡單。 我們基本上是在告訴計算機將 10 的值分配給n 對人類而言,“10”是分配給特定事物或事物數量的數值(例如,溫度為 10 度,或者我有 10 個蘋果),但對處理器/計算機而言,它對其意義不大自己的。 至少在我們的場景中不是。 所以我們只是告訴處理器計算一些行ROW_NUMBER ,當它找到 10 行時,這就是 10 的樣子。 您可以使用LIMIT使其大於或小於 10 個月。

在外部查詢中,我們只取今天的日期CURRENT_DATE並從中減去n個月,如(DATEADD('MONTH', -n, (CURRENT_DATE+1) 。在我們的例子中, n是 10 個月。

現在您有一列日期,按照您的要求YYYY-MM格式化。

您可以編寫查詢,以便將處理過的數據集LEFT JOIN到這些日期的相應值。

這是一種很好的處理方式的原因是您不必手動輸入任何日期或使用UNION連接。 您讓窗口函數為您完成工作,這意味着您可以通過更改LIMIT值輕松地根據需要/或想要的時間回到過去。 例如,如果您需要返回多年,這可以提高效率。

暫無
暫無

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

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