获取两个日期之间每个月的查询结果

问题描述

创建表链接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

这将创建以下输出。

enter image description here

代码说明:

内部查询基于窗口函数。 窗口函数本身很简单。我们基本上是告诉计算机将值 10 分配给 n。对人类而言,“10”是分配给特定事物或事物数量的数值(例如,温度为 10 度,或者我有 10 个苹果),但对处理器/计算机而言,它对其意义不大自己的。至少在我们的场景中不是。所以我们只是告诉处理器计算一些行 ROW_NUMBER 并且当它找到 10 行时,这就是 10 的样子。您可以使用 LIMIT 将其设置为大于或小于 10 个月。

在外部查询中,我们只取今天的日期 CURRENT_DATE 并从中减去 n 个月,就像在 (DATEADD('MONTH',(CURRENT_DATE+1) 中一样。 在我们的例子中,n 是 10 个月。

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

您可以编写查询,使您将处理过的数据集LEFT JOIN 设置为这些日期的相应值。

这是一种很好的处理方式的原因是您不必手动输入任何日期或使用 UNION 连接。您可以让窗口函数为您完成工作,这意味着您可以通过更改 LIMIT 值轻松地根据需要/或想要回到过去。例如,如果您需要返回多年,这样可以提高效率。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...