得到一个"计数"在数据库中使用"其中"设置日期限制

时间:2017-10-12 01:30:46

标签: mysql date range

我有一个数据库,其中有一个表来保存报告。每个报告都有一个日期(年 - 月 - 日),每当报告创建时都会设置该日期。

经过大量测试后,我得到了一些工作,但并不像我希望的那样工作。

我想获得从初始日期(年 - 月 - 日)到最终日期(年 - 月 - 日)的每个月的报告数量。但我不太确定如何完成它。

这是我现在正在使用的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

我现在有两个问题:

  1. 当我使用句子"其中"没有显示在指定日期有0个报告的月份。如果我不使用"其中",我几乎按照我想要的方式得到的东西,但不是我想要的日期范围。

  2. 我遇到的另一个问题是我希望得到月份的年份(如上面所需的代码块所示)。

  3. 我希望这有足够的信息来理解一切,我不确定我是否可以提供数据库,但如果您认为这会有所帮助,请告诉我。

2 个答案:

答案 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?