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

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

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

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

Ruby on Rails

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

Ruby on Rails 4

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

Q&A

解決済

3回答

12476閲覧

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

s_diff

総合スコア109

Ruby

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

Ruby on Rails

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

Ruby on Rails 4

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

0グッド

1クリップ

投稿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}
何かご教示いただけることがあれば、何卒よろしくお願いいたします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/12/27 08:39

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

2018/12/27 08:43

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

回答3

0

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

投稿2018/12/27 08:29

motozzi

総合スコア86

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

s_diff

2018/12/27 08:40

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

2018/12/27 09:07

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

2018/12/27 09:14 編集

別途回答しておきます。
guest

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

総合スコア109

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問