package tests import ( "testing" "github.com/jinzhu/gorm" ) func TestGroupBy(t *testing.T, db *gorm.DB) { db.Migrator().DropTable(&User{}) db.AutoMigrate(&User{}) t.Run("GroupBy", func(t *testing.T) { var users = []User{{ Name: "groupby", Age: 10, Birthday: Now(), }, { Name: "groupby", Age: 20, Birthday: Now(), }, { Name: "groupby", Age: 30, Birthday: Now(), }, { Name: "groupby1", Age: 110, Birthday: Now(), }, { Name: "groupby1", Age: 220, Birthday: Now(), }, { Name: "groupby1", Age: 330, Birthday: Now(), }} if err := db.Create(&users).Error; err != nil { t.Errorf("errors happened when create: %v", err) } var name string var total int if err := db.Model(&User{}).Select("name, sum(age)").Where("name = ?", "groupby").Group("name").Row().Scan(&name, &total); err != nil { t.Errorf("no error should happen, but got %v", err) } if name != "groupby" || total != 60 { t.Errorf("name should be groupby, but got %v, total should be 60, but got %v", name, total) } if err := db.Model(&User{}).Select("name, sum(age) as total").Where("name LIKE ?", "groupby%").Group("name").Having("name = ?", "groupby1").Row().Scan(&name, &total); err != nil { t.Errorf("no error should happen, but got %v", err) } if name != "groupby1" || total != 660 { t.Errorf("name should be groupby, but got %v, total should be 660, but got %v", name, total) } }) }