group by 分组

注意:本教程使用的数据库脚本、数据模型和环境信息请参考 “MyBatis Plus环境准备” 章节,点击下载示例源码

本章节将介绍使用 groupBy 实现分组,groupBy 函数定义如下:

groupBy(R... columns)
groupBy(boolean condition, R... columns)

参数说明:

  • columns:要分组的数据表列名称列表

  • condition:用于指定当前这个条件是否有效;如果为 true,则应用当前条件;如果为 false,则忽略当前条件。

实例:用户信息表根据 sex 和 age 列进行分组,如下:

QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
wrapper.groupBy("sex", "age");

运行上面代码,你实际上将执行如下 SQL 语句:

SELECT user_id,name,sex,age,face,salary,borthday FROM user GROUP BY sex,age

仔细观察上面的 SQL 语句,这并不是我们想要的 SQL 语句,只有后面的“GROUP BY sex,age”是我们想要的。而我们实际上需要的 SQL 可能如下:

-- 统计按 sex 和 age 分组后,每一个 sex 和 age 组合的总薪水
SELECT sex, age, sum(salary) as total_salary FROM user GROUP BY sex,age;
-- 统计同一个 sex 和 age 的用户数
SELECT sex, age, count(*) as user_count FROM user GROUP BY sex,age;
-- 统计同一个 sex 和 age 的用户平均薪水
SELECT sex, age, avg(salary) as avg_salary FROM user GROUP BY sex,age;

示例代码

下面通过实例演示根据 sex 和 age 分组,然后统计他们的总薪水、用户数和平均薪水。代码如下:

package com.hxstrive.mybatis_plus.simple_mapper.condition;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.hxstrive.mybatis_plus.mapper.SimpleMapper;
import com.hxstrive.mybatis_plus.model.UserBean;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;

@RunWith(SpringRunner.class)
@SpringBootTest
class Condition22Test {

    @Autowired
    private SimpleMapper simpleMapper;

    private void totalSalary() {
        QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
        wrapper.groupBy("sex", "age");
        wrapper.select("sex, age, sum(salary) as total_salary");

        List<UserBean> userBeanList = simpleMapper.selectList(wrapper);
        for(UserBean userBean : userBeanList) {
            System.out.println("sex=" + userBean.getSex() + ", age=" + userBean.getAge()
                    + ", totalSalary=" + userBean.getTotalSalary());
        }
    }

    private void totalCount() {
        QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
        wrapper.groupBy("sex", "age");
        wrapper.select("sex, age, count(*) as total_count");

        List<UserBean> userBeanList = simpleMapper.selectList(wrapper);
        for(UserBean userBean : userBeanList) {
            System.out.println("sex=" + userBean.getSex() + ", age=" + userBean.getAge()
                    + ", totalCount=" + userBean.getTotalCount());
        }
    }

    private void avgSalary() {
        QueryWrapper<UserBean> wrapper = new QueryWrapper<>();
        wrapper.groupBy("sex", "age");
        wrapper.select("sex, age, avg(salary) as avg_salary");

        List<UserBean> userBeanList = simpleMapper.selectList(wrapper);
        for(UserBean userBean : userBeanList) {
            System.out.println("sex=" + userBean.getSex() + ", age=" + userBean.getAge()
                    + ", avgSalary=" + userBean.getAvgSalary());
        }
    }

    @Test
    void contextLoads() {
        totalCount();
        totalSalary();
        avgSalary();
    }

}

运行上面代码,输出结果如下:

==>  Preparing: SELECT sex, age, count(*) as total_count FROM user GROUP BY sex,age
==> Parameters: 
sex=女, age=20, totalCount=16
sex=女, age=21, totalCount=11
...
sex=男, age=68, totalCount=7
sex=男, age=69, totalCount=13

==>  Preparing: SELECT sex, age, sum(salary) as total_salary FROM user GROUP BY sex,age
==> Parameters: 
sex=女, age=20, totalSalary=109333.5
sex=女, age=21, totalSalary=60554.25
...
sex=男, age=68, totalSalary=48114.0
sex=男, age=69, totalSalary=68889.0

==>  Preparing: SELECT sex, age, avg(salary) as avg_salary FROM user GROUP BY sex,age
==> Parameters: 
sex=女, age=20, avgSalary=6833.3438
sex=女, age=21, avgSalary=5504.9316
...
sex=男, age=68, avgSalary=6873.4287
sex=男, age=69, avgSalary=5299.154

注意:上面示例中的“wrapper.select();”select 方法用来设置 SELECT 语句的列字符串,例如:SELECT wrapper.select() FROM user


说说我的看法
全部评论(

UserBean的定义没找到啊,能提供下吗


回复:
package com.hxstrive.mybatis_plus.model;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.util.Arrays;
import java.util.Date;

@TableName("user")
public class UserBean {
@TableId(value = "user_id", type = IdType.AUTO)
private Integer userId;
private String name;
private String sex;
private Integer age;
private byte[] face;
private Float salary;
private Date borthday;

/** 下面不是数据表字段,暂时存放统计数 */
// 年龄总数
@TableField(exist = false)
private int count;

// 用户总数
@TableField(exist = false)
private int totalCount;

// 总薪水
@TableField(exist = false)
private float totalSalary;

// 平均薪水
@TableField(exist = false)
private float avgSalary;


public UserBean() {}

public UserBean(Integer userId, String name) {
this.userId = userId;
this.name = name;
}

public UserBean(Integer userId, String name, String sex, Integer age) {
this.userId = userId;
this.name = name;
this.sex = sex;
this.age = age;
}

public int getCount() {
return count;
}

public void setCount(int count) {
this.count = count;
}

public Integer getUserId() {
return userId;
}

public void setUserId(Integer userId) {
this.userId = userId;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getSex() {
return sex;
}

public void setSex(String sex) {
this.sex = sex;
}

public Integer getAge() {
return age;
}

public void setAge(Integer age) {
this.age = age;
}

public byte[] getFace() {
return face;
}

public void setFace(byte[] face) {
this.face = face;
}

public Float getSalary() {
return salary;
}

public void setSalary(Float salary) {
this.salary = salary;
}

public Date getBorthday() {
return borthday;
}

public void setBorthday(Date borthday) {
this.borthday = borthday;
}

public int getTotalCount() {
return totalCount;
}

public void setTotalCount(int totalCount) {
this.totalCount = totalCount;
}

public float getTotalSalary() {
return totalSalary;
}

public void setTotalSalary(float totalSalary) {
this.totalSalary = totalSalary;
}

public float getAvgSalary() {
return avgSalary;
}

public void setAvgSalary(float avgSalary) {
this.avgSalary = avgSalary;
}

@Override
public String toString() {
return "UserBean{" +
"userId=" + userId +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
", age=" + age +
", face=" + Arrays.toString(face) +
", salary=" + salary +
", borthday=" + borthday +
'}';
}

}


关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号