【问题标题】:ActiveRecord group count with zeroesActiveRecord 组计数为零
【发布时间】:2015-12-11 07:17:52
【问题描述】:
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 查询返回按年和月分组的公司计数。

问题在于它不会返回包含 家公司的组的任何条目。

我希望查询返回所有组,包含从创建第一家公司的月份开始的每个月_at 到当前月份,如下所示:

{[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 查询解决方案。

【问题讨论】:

  • 是的,我讨厌长的单行sn-ps代码。当您滚动它们时,滚动条会隐藏大部分代码,并且无法阅读或查看您是否滚动了足够多的代码:)
  • 当然,我曾经将这么长的sn-ps复制到控制台或其他地方以查看整个内容!
  • 如果你在 sqlfiddle 中创建了一个示例数据集,我会修改它:)
  • 我还没有。您是否有机会根据您的任何 Rails 项目数据库寻找解决方案?
  • 你有没有想过calendar table?该网站非常蹩脚,但这样的表格有很多很棒的用例。这是我的recent usecase

标签: mysql sql ruby-on-rails activerecord grouping


【解决方案1】:

你有没有想过calendar table?虽然网站很老了,但是还是很好的描述了这样一张表的使用:

  • 生成每天的连续销售总额,包括周末等没有销售的日子。
  • 需要按季节跟踪数据,无论这对您的公司意味着什么。
  • 需要使用滚动月份/期间比较数据。

虽然其中许多问题可以通过编写 SQL 代码来解决,但使用专用日期表会更容易。此外,可以自定义日期表以跟踪您想要的特定日期的任何内容。

因此,在您的情况下,您将创建这样一个表,然后将其与您的 Company 模型简单地连接起来。

导致如下查询:

CalendarDay.where(year: Date.current.year).joins(:companies).group('YEAR(companies.created_at)').count

【讨论】:

  • 感谢您的建议,但如果可能的话,我更喜欢不引入新表的解决方案。
  • 我想不出其他解决方案,但我渴望更多答案
猜你喜欢
  • 1970-01-01
  • 2018-11-18
  • 1970-01-01
  • 2016-05-26
  • 1970-01-01
  • 1970-01-01
  • 2015-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多