EzJDBCで「GROUP BY」始めました(^^)
本日はEzJDBCで「GROUP BY」する方法について説明したいと思います。
ORDERテーブルとORDER_ITEMORDERを結合し、お客様ID毎の請求合計額を求める場合を例に説明いたします。
// ORDERテーブル情報インスタンス生成
ORDER OD = new ORDER();
// ORDERとORDER_ITEMを結合し、お客様ID毎の請求金額の照会
Listlist = EzJDBC.selects(OD.customerId, OD.CS.name, OD.OI.amount.sum())
.from(OD.OI).join(OD.CS)
.groupBy(OD.customerId, OD.CS.name)
.find(Order.class);
見たまんまですね、簡単でしょ...(^^)
EzJDBC#selectsソッドに選択項目を設定し、EzJDBC#groupByメソッドで集約項目を設定するだけです。
ネイティブSQLと異なる箇所は集計関数の箇所だけです。ネイティブSQLであれば「sum(OD.OI.amount)」とするところが「OD.OI.amount.sum()」とします。
static importを利用して「EzJDBC.selects(sum(OD.OI.amount))...」とする事は可能でしたが、static importを強要するぐらいであれば「OD.OI.amount.sum()」は許容範囲かなと思い、この形にしました。
また、集約項目(groupByで指定する項目)とSELECT項目が同じであった場合は、groupByメソッドの引数は省略できます。groupByメソッドの引数を省略した場合は、selects(又はselect)メソッドで設定した項目が集約項目として扱われます。
この時、selectsメソッドで設定した項目で集計関数メソッド(sum()等)が呼び出されている項目は、集約項目から除外されます。
List
list = EzJDBC.selects(OD.customerId, OD.CS.name, OD.OI.amount.sum())
.from(OD.OI).join(OD.CS)
.groupBy()
.find(Order.class);
EzJDBCで利用できる集計関数は以下の5つです。
集計関数 | メソッド | 意味 |
AVG | TableColumn#avg() | 平均値 |
COUNT | TableColumn#count() | 個数 |
MIN | TableColumn#min() | 最小値 |
MAX | TableColumn#max() | 最大値 |
SUM | TableColumn#sum() | 合計値 |