0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Rails】ActiveRecordで合計(sum)した列に列名(AS句)をつけたい【GROUP BY】

Posted at

はじめに

久々にRailsを弄っているがちょっと詰まったので。

環境

Ruby 2.6.6
Rails 6.0.4.1
MySQL 14.14

やりたかったこと

適当な例として、商品名,販売価格,販売日を持つ売上テーブルがある。
中身はこんな感じ。

売上テーブル中身
select name,money,date from sales;

えんぴつ,300,2021-11-01
消しゴム,100,2021-11-01
ボールペン,400,2021-11-03
A4用紙,500,2021-11-03
ものさし,400,2021-11-03
万年筆,8000,2021-11-04
替え芯,500,2021-11-04

これを販売日ごとに売上金を合計(sum)して、その集計した列に名前をAS句で別名をつけたかった。

普通にActiveRecordで集計すると列名に応じて自動で集計列が命名される。

日付ごとに売上金を集計するActiveRecord
@sale = Sale.select("date").group("date").sum("money")
実際に発行されるSQL
  SELECT SUM(`sales`.`money`) AS sum_money, 
         `sales`.`date`       AS sales_date 
    FROM `sales` 
GROUP BY `sales`.`date`

このASとなっている所を手動で設定したかったが、中々上手くいかなかった。

結論

調べてみたらselectメソッドにそのままSQL文を書くらしい。ええ・・・

日付ごとに売上金を集計するActiveRecord(AS句で列名を指定)
@sale = Sale.select("sum(money) as total_money, date").group("date")
実際に発行されるSQL
  SELECT SUM(`sales`.`money`) AS total_money, 
         `sales`.`date`
    FROM `sales` 
GROUP BY `sales`.`date`

CASE文とかも同様の方法で使えるらしい。

おわりに

railsはなるべく素のSQL文を書かないようにしていたのでちょっと違和感。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?