我在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子句中的表。但是为了解决未来的问题而陷入困境。
有什么建议吗?谢谢!!
答案 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年的数据列入第二和第三列。