メインコンテンツへスキップする

集約

Group By

全ユーザのフィールド nameage をグループ化し、それらの年齢の合計を出す。

package main

import (
"context"

"<project>/ent"
"<project>/ent/user"
)

func Do(ctx context.Context, client *ent.Client) {
var v []struct {
Name string `json:"name"`
Age int `json:"age"`
Sum int `json:"sum"`
Count int `json:"count"`
}
err := client.User.Query().
GroupBy(user.FieldName, user.FieldAge).
Aggregate(ent.Count(), ent.Sum(user.FieldAge)).
Scan(ctx, &v)
}

1つのフィールドでグループ化します。

package main

import (
"context"

"<project>/ent"
"<project>/ent/user"
)

func Do(ctx context.Context, client *ent.Client) {
names, err := client.User.
Query().
GroupBy(user.FieldName).
Strings(ctx)
}

エッジで Group By

カスタム集計関数は、ストレージに特化した独自のロジックを記述したい場合に便利です。

以下は、すべてのユーザーのidnameでグループ化し、ペットのageの平均を計算する方法です。

package main

import (
"context"
"log"

"<project>/ent"
"<project>/ent/pet"
"<project>/ent/user"
)

func Do(ctx context.Context, client *ent.Client) {
var users []struct {
ID int
Name string
Average float64
}
err := client.User.Query().
GroupBy(user.FieldID, user.FieldName).
Aggregate(func(s *sql.Selector) string {
t := sql.Table(pet.Table)
s.Join(t).On(s.C(user.FieldID), t.C(pet.OwnerColumn))
return sql.As(sql.Avg(t.C(pet.FieldAge)), "average")
}).
Scan(ctx, &users)
}