我有一个数据库,其中有一个表来保存报告。每个报告都有一个日期(年 - 月 - 日),每当报告创建时都会设置该日期。
经过大量测试后,我得到了一些工作,但并不像我希望的那样工作。
我想获得从初始日期(年 - 月 - 日)到最终日期(年 - 月 - 日)的每个月的报告数量。但我不太确定如何完成它。
这是我现在正在使用的MySQL句子:
SELECT meses.month id_mes, count(re_fecha) total
FROM
(
SELECT 1 AS MONTH
UNION SELECT 2 AS MONTH
UNION SELECT 3 AS MONTH
UNION SELECT 4 AS MONTH
UNION SELECT 5 AS MONTH
UNION SELECT 6 AS MONTH
UNION SELECT 7 AS MONTH
UNION SELECT 8 AS MONTH
UNION SELECT 9 AS MONTH
UNION SELECT 10 AS MONTH
UNION SELECT 11 AS MONTH
UNION SELECT 12 AS MONTH
) as meses
LEFT JOIN reportes ON month(re_fecha) = meses.MONTH
WHERE re_fecha BETWEEN '2017-01-01' AND '2017-08-31'
GROUP BY meses.MONTH, monthName(re_fecha)
这是以下我得到的MySQL句子的结果:
id_mes | total
---------------
04 | 15
05 | 5
06 | 15
07 | 2
我不确定这是否有任何帮助,但如果我不使用"那么re_fechas ......"我得到的结果更接近我们想要的结果:
id_mes | total
-------------
01 | 0
02 | 0
03 | 0
04 | 15
05 | 5
06 | 15
07 | 2
08 | 6
09 | 0
10 | 0
11 | 0
12 | 0
最后,我想看到的内容:
id_mes | total
-------------------
01-2017 | 0
02-2017 | 0
03-2017 | 0
04-2017 | 15
05-2017 | 5
06-2017 | 15
07-2017 | 2
08-2017 | 6
我现在有两个问题:
当我使用句子"其中"没有显示在指定日期有0个报告的月份。如果我不使用"其中",我几乎按照我想要的方式得到的东西,但不是我想要的日期范围。
我遇到的另一个问题是我希望得到月份的年份(如上面所需的代码块所示)。
我希望这有足够的信息来理解一切,我不确定我是否可以提供数据库,但如果您认为这会有所帮助,请告诉我。
答案 0 :(得分:0)
在您的查询中尝试将WHERE更改为AND。
答案 1 :(得分:0)
你几乎得到了它。
如果您在OR re_fecha IS NULL
条款中添加WHERE
,那么您几乎可以获得所需内容。
我提出了另一个可以帮助你的解决方案:
SELECT meses.aMonth aMonth, COUNT(re_fecha) total
FROM (
-- Listing all months in period
SELECT DATE_FORMAT(m1, '%m-%Y') aMonth
FROM (
-- Range limit: about 21 years
SELECT
('2017-01-01' - INTERVAL DAYOFMONTH('2017-01-01')-1 DAY) +INTERVAL m MONTH as m1
FROM (
SELECT @rownum:=@rownum+1 m FROM
(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) t1,
(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) t2,
(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) t3,
(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) t4,
(SELECT @rownum:=-1) t0 ) d1
) d2
WHERE m1 <= '2017-08-31'
ORDER BY m1) meses
LEFT JOIN reportes ON DATE_FORMAT(re_fecha, '%m-%Y') = meses.aMonth
WHERE re_fecha BETWEEN '2017-01-01' AND '2017-08-31'
OR re_fecha IS NULL
GROUP BY meses.aMonth;
测试它:http://sqlfiddle.com/#!9/d21de6/27
示例输出:
aMonth total
01-2017 0
02-2017 0
03-2017 0
04-2017 15
05-2017 5
06-2017 0
07-2017 2
08-2017 0
如果您没有使用MySQL,那么您可以使用FULL OUTER JOIN
代替LEFT JOIN
。
请记住,此解决方案仅限于21年。尝试将初始日期更改为1970年,并亲自查看
如果需要,请添加更多(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) tn,
以增加月数。
参考资料和有用的链接:
MySQL monthly Sale of last 12 months including months with no Sale
How to get a list of months between two dates in mysql
How to do a FULL OUTER JOIN in MySQL?