[英]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.