質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

解決済

[Ruby On Rails]groupメソッドで月ごとの集計を取りたいが、別の年のレコードも混ざってしまう。

s_diff
s_diff

総合スコア107

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

3回答

0グッド

1クリップ

10225閲覧

投稿2018/12/27 08:22

groupメソッドで月ごとの集計を取りたいのですが、他の年のレコードが混ぜってしまいます。
たとえば2018年12月の集計を取りたいのに、2017年12月や2019年12月のレコードが混ざってしまいます。

##環境
macOS High Sierra(バージョン10.13.6)
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin17]
Rails 4.2.6

##試したこと
以下のような実装をしました。

ruby

1month_requests_count = Request.group("MONTH(created_at))").count

これでは他の年のレコードがまざってしまうので、

ruby

1month_requests_count = Request.group("CONCAT(YEAR(created_at), MONTH(created_at))").count

このようにして見ましたが、これだと
{"201810"=>142, "201811"=>165, "201812"=>107, "20186"=>110, "20187"=>112, "20188"=>101, "20189"=>104}
のように、6月よりも10月のほうが先にきてしまいます。

##求める結果
以下のように年ごと、月ごとのハッシュを順番に取得したいです。
{"20186"=>110, "20187"=>112, "20188"=>101, "20189"=>104"201810"=>142, "201811"=>165, "201812"=>107}
何かご教示いただけることがあれば、何卒よろしくお願いいたします。

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

m.ts10806

2018/12/27 08:39

回答依頼いただいて申し訳ないのですがRuby知識は全くないので他の方に回してもらえたらと 。 回答依頼を出したいユーザーの登録タグは確認した方が良いですよ。
s_diff

2018/12/27 08:43

見落としていました。気をつけます。 ご指摘有難うございます。

回答3

1

select DATE_FORMAT(created_at, '%Y%m'), count(id) from articles group by DATE_FORMAT(created_at, '%Y%m');

をRailsに書き換えると

monthly_count = Article.group("DATE_FORMAT(created_at, '%Y%m')").select("DATE_FORMAT(created_at, '%Y%m') as month, count(id) as cnt") monthly_count.each do |monthly_cnt| p monthly_cnt.month p monthly_cnt.cnt end

こんな感じでどうでしょう?

投稿2018/12/27 09:14

motozzi

総合スコア86

s_diff👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

1

ほぼほぼできていますね。
あとは月の取り方を201801とかにすれば、
order byするなりできるかと思います。
もしくは、そのままうまくでてくるかもですね。

投稿2018/12/27 08:29

motozzi

総合スコア86

s_diff👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

s_diff

2018/12/27 08:40

ご回答有難うございます。 月の取り方を201801のようにする方法をググってみても見つけられなかったのですが もしよろしければ教えていただけますか?
motozzi

2018/12/27 09:07

データを見せていただくことはできますか?
motozzi

2018/12/27 09:14 編集

別途回答しておきます。

0

自己解決

month_requests_count = Request.group("YEAR(created_at)").group("MONTH(created_at)").count
のようにすることで、
{[2018, 6]=>110, [2018, 7]=>112, [2018, 8]=>101, [2018, 9]=>104, [2018, 10]=>142, [2018, 11]=>165, [2018, 12]=>107}
と順番に取得できました。
ご指摘ありがとうございました。

投稿2018/12/27 08:51

s_diff

総合スコア107

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。