Company.group('year(created_at)').group('month(created_at)').count
#=> {[2015, 4]=>62, [2015, 5]=>77, [2015, 6]=>61, [2015, 7]=>19, [2015, 8]=>16}
上述AR查询按年份和月份返回公司的分组数量。
问题是,它不会为零公司的组返回任何条目。
我希望查询能够返回所有组,包含从月份开始的每个月,当第一家公司被创建_当前月份时,如下所示:
{[2015, 4]=>62, [2015, 5]=>77, [2015, 6]=>61,
[2015, 7]=>19, [2015, 8]=>16, [2015, 9]=>0} #note the last entry - it is September (9nth month) with zero companies.
我知道,MySQL需要至少一行来返回一个组。
我的需求是否确实存在变通方法?
我正在寻找一种AR查询解决方案而不引入任何新表格。
答案 0 :(得分:0)
您是否考虑过calendar table?虽然该网站非常陈旧,但它仍然很好地描述了这样一个表的使用:
- 每天生成一个正在运行的销售总额,并包括您没有销售的日期,例如周末。
- 需要按季节跟踪数据,无论这对贵公司意味着什么。
- 需要使用滚动月份/期间来比较数据。
虽然许多问题都可以通过编写SQL代码来处理,但使用专用日期表会更容易。此外,可以自定义日期表以跟踪您想要的特定日期的任何信息。
因此,在您的情况下,您将创建一个这样的表,然后将其与您的Company
模型一起加入。
导致类似以下的查询:
CalendarDay.where(year: Date.current.year).joins(:companies).group('YEAR(companies.created_at)').count