用Stream实现mysql的groupBy, sum Case when 语法

由于最近项目上进行了大升级,shardingsphere从3升级到了shardingsphere5.1.1,导致mybatis中写的定制化的好多SQL语句报错:sytax error,很显然诸如case when这类的语法已经不支持了,没办法只能在内存中group by ,case when 后进行一个 sum 的操作。业务上就是统计状态字段出现的次数。

SQL语句的原型:

select company_id,
          business_date,
          SUM(CASE status WHEN 0 THEN 1 else 0 end) zeroCnt,
          SUM(CASE status WHEN 1 THEN 1 else 0 end) twoCnt,
          SUM(CASE status WHEN 2 THEN 1 else 0 end) thereCnt
 from table
 group by company_id, business_date

通过Stream实现

    @Test
    public void testStreamGroupBySum(){
        UserBO userBO = new UserBO(1000, "2022-09-02", 0);
        UserBO userBO1 = new UserBO(1000, "2022-09-02", 1);
        UserBO userBO2 = new UserBO(1000, "2022-09-03", 2);
        UserBO userBO3 = new UserBO(1000, "2022-09-03", 0);
        ArrayList<UserBO> list = new ArrayList<UserBO>();
        list.add(userBO);
        list.add(userBO1);
        list.add(userBO2);
        list.add(userBO3);

        List<UserStatistic> userStatistics = list.stream().collect(Collectors.groupingBy(UserBO::getAttnDate)).entrySet().stream().map(entry -> {

            UserStatistic userStatistic = new UserStatistic();

            if (!CollectionUtils.isEmpty(entry.getValue())) {
                userStatistic.setCompanyId(entry.getValue().get(0).getCompanyId());
            }

            userStatistic.setAttnDate(entry.getKey());

            Map<Integer, Long> map = entry.getValue().stream().collect(Collectors.groupingBy(UserBO::getStatus, Collectors.counting()));
            userStatistic.setNormalCnt(map.getOrDefault(UserStatusEnum.NORMAL.getKey(), 0L));
            userStatistic.setAbsenceCnt(map.getOrDefault(UserStatusEnum.ABSENCE.getKey(), 0L));
            userStatistic.setExpireCnt(map.getOrDefault(UserStatusEnum.EXPIRE.getKey(), 0L));

            return userStatistic;
        }).sorted().collect(Collectors.toList());
        System.out.println(JSON.toJSONString(userStatistics));
    }

测试结果:

[{"absenceCnt":0,"attnDate":"2022-09-03","companyId":1000,"expireCnt":1,"normalCnt":1},{"absenceCnt":1,"attnDate":"2022-09-02","companyId":1000,"expireCnt":0,"normalCnt":1}]

如果感觉对你有所帮助,烦请来个一键三连哦

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值