在mysql中比较两个月的数据

时间:2016-02-02 14:04:20

标签: mysql

我在mysql中有一个像这样的表

   Date       Cases Type
   2015-12-01     1 A
   2015-12-10     2 B
   2015-12-25     1 A
   2015-12-11     1 B
   2015-11-14     2 B
   2015-11-12     2 B
   2015-11-13     2 B
   2015-11-14     2 B
   2015-11-14     2 B
   2015-10-15     2 B
   2015-10-16     2 B
   2015-10-17     2 A
   2015-10-18     2 A
   2015-10-19     2 B
   2015-09-20     2 A
   2015-09-21     2 B
   2015-09-22     2 A
   2015-09-23     2 B
   2015-09-24     2 A
   2015-08-25     2 B
   2015-08-26     2 B
   2015-08-27     2 A
   2015-08-28     2 B
   2015-08-29     2 B
   2015-08-30     2 A
   2015-07-01     2 B
   2015-07-02     2 A
   2015-07-03     2 B
   2015-07-04     2 B
   2015-07-05     2 A
   2015-07-06     2 B
   2015-07-07     2 B
   2015-07-08     2 A
   2015-06-09     2 B
   2015-06-10     2 A
   2015-06-11     2 B
   2015-06-12     2 B
   2015-05-13     2 A
   2015-05-14     2 B
   2015-04-15     2 B
   2015-04-16     2 A
   2015-04-15     2 B
   2015-03-16     2 B
   2015-03-15     2 A
   2015-03-16     2 B
   2015-03-15     2 B
   2015-02-16     2 A
   2015-02-15     2 B
   2015-02-16     2 A
   2015-01-16     2 B
   2015-01-15     2 A
   2015-01-16     2 B
   2014-12-25     1 B
   2014-12-11     1 A
   2014-11-14     2 A
   2014-11-12     2 A
   2014-11-13     2 A
   2014-11-14     2 A
   2014-10-15     2 A
   2014-10-16     2 A
   2014-10-17     2 B
   2014-10-18     2 B
   2014-10-19     2 A
   2014-09-20     2 B
   2014-09-21     2 A
   2014-09-22     2 B
   2014-09-23     2 A
   2014-09-24     2 B
   2014-08-25     2 A
   2014-08-26     2 A
   2014-08-27     2 B
   2014-08-28     2 A
   2014-08-29     2 A
   2014-08-30     2 B
   2014-07-01     2 A
   2014-07-02     2 B
   2014-07-03     2 A
   2014-07-04     2 A
   2014-07-05     2 B
   2014-07-06     2 A
   2014-07-07     2 A
   2014-07-08     2 B
   2014-06-09     2 A
   2014-06-10     2 B
   2014-06-11     2 A
   2014-06-12     2 A
   2014-05-13     2 B
   2014-05-14     2 A
   2014-04-15     2 A
   2014-04-16     2 B
   2014-04-15     2 A
   2014-03-16     2 A
   2014-03-15     2 B
   2014-03-16     2 A
   2014-03-15     2 A
   2014-02-16     2 B
   2014-02-15     2 A
   2014-02-16     2 B
   2014-01-16     2 A
   2014-01-15     2 B
   2014-01-16     2 A

我想要这样的输出

Month   2015(cases)     2014(cases)
Jan         6               6
Feb         6               6 
 |
 |
Dec         5               2

我在某种程度上尝试过这样的

SELECT SUM(Cases), MONTHNAME(Date), 2015 as YEAR FROM cases
                        WHERE YEAR(Date) = 2015 GROUP BY MONTHNAME(Date)
            UNION ALL        
               SELECT SUM(Cases), MONTHNAME(Date), 2014 as YEAR FROM cases
                        WHERE YEAR(Date) = 2014 GROUP BY MONTHNAME(Date)

尝试将其用作from子句中的表。但是为了解决未来的问题而陷入困境。

有什么建议吗?谢谢!!

1 个答案:

答案 0 :(得分:1)

您在尝试的解决方案中显示为CLOSE ...尝试

SELECT 
      MONTHNAME(Date) as ShowMonth,
      COALESCE( SUM( case when year( Date ) = 2015 then cases else 0 end ), 0 ) as Cases2015,
      COALESCE( SUM( case when year( Date ) = 2014 then cases else 0 end ), 0 ) as Cases2014
   from
      ( select
              Month( @fakeDate ) as MonthNumber,
              @fakeDate := DATE_ADD( @fakeDate, INTERVAL 1 MONTH))
           from 
              ( select @fakeDate := '2014-01-01' ) sqlvars,
              cases
           limit 12 ) allMonths
         JOIN Cases
            on allMonths.MonthNumber = Month( cases.Date )
   where
      Year( Date ) in ( 2014, 2015 )
   group by
      MONTHNAME(Date) 
   order by
      MONTH( Date )

这将按照数字表示顺序排列月份,但显示NAME。列将代表每个年份的案例。

内部查询将创建一个假日表,其中包含从2014年1月1日开始的12个月期间的日期,因此LIMIT 12将在12个月之前到2014年12月。现在我们有可能的所有月份(12条记录)和在同一个月加入到实际数据的案例表中。所以现在你应该得到所有12个月,不管数据流中是否有一个月。

要修复没有值的那些,我已将查询更改为COALESCE()以防止" NULL"作为返回值。 (除非你可以在输出中显示null)。

我还将2015年的数据列入第二和第三列。