这里我的表属于不规范,也是业务影响 显示和筛选在同一表中  查询很麻烦  

业务需求 业务统计  费用   ,同时根据多个区间范围条件筛选

1.筛选SQL实现逻辑

 用电信息和类型在同一表中 又需要根据用电筛选

类型;1:销售,2:纳税,3:用水,4:用电:5用气,6:社保,7:社保缴纳,9:欠费

解决方法 这里听了阿里p6大佬的解决方法 用外连接查询 


主表 left join (select * from 表名 where 筛选条件 ) as 别名


由于后期发现使用外连接查询过慢,改为where条件中,弃用外连接

2.  最麻烦的也是这一步

查询多条件 ,1  0-100   2. 100-150  3. 150-200  4. 200以上

 这里大佬给的解决方案是 用  between  and    

由于我的多选条件后期产品要改  我的多选条件放到字典中配置

前端从字典中 取出  传给后端一个 List<String>集合

后端拿到处理 ,这里大佬说要避免sql注入  拼接是要用 Lambda 表达式验证 ,循环处理

最后在sql ,中拼接

后端处理多条件方法    这里大佬教我,在代码中拼接SQl

// 解析前台传入的查询参数,并转换成可用的sql字符串,校验字符串防止sql注入,如:1~100,1000~
//  Lambda  表达式 
//  Pattern pattern = Pattern.compile("Lambda  表达式 ");


//然后用 stream  循环处理一下
private List<String> 方法(List<String> codes, Pattern pattern) {
        return codes.stream().map(code -> {
            if (!pattern.matcher(code).matches()) {
                return "";
            }
            String[] split = Strings.split(code, "~");
            if (split.length > 1) {
                return String.format("between %s and %s", split[0], split[1].isEmpty() ? Integer.MAX_VALUE :
                        split[1]);
            }
            return "";
        }).filter(StringUtils::isNotBlank).collect(Collectors.toList());
    }

sql语句    sql中的季度后期优化,改为存储到表中,增加查询效率,不在计算

select                         
        id,
        企业名称,
        企业编码,
        类型,
        年,
        ROUND(IFNULL(SUM(月), 0), 2)      AS 统计金额,
        ROUND(IFNULL(SUM(月), 0), 2)      AS 统计金额,
        ROUND(IFNULL(SUM(月), 0), 2)      AS 统计金额,
        ROUND(IFNULL(SUM(月), 0), 2)      AS 统计金额,
        ROUND(IFNULL(SUM(月), 0), 2)      AS 统计金额,
        ROUND(IFNULL(SUM(月), 0), 2)      AS 统计金额,
        ROUND(IFNULL(SUM(月), 0), 2)      AS 统计金额,
        ROUND(IFNULL(SUM(月), 0), 2)      AS 统计金额,
        ROUND(IFNULL(SUM(月), 0), 2)      AS 统计金额,
        ROUND(IFNULL(SUM(月), 0), 2)      AS 统计金额,
        ROUND(IFNULL(SUM(月), 0), 2)      AS 统计金额,
        ROUND(IFNULL(SUM(月), 0), 2)      AS 统计金额,
        <!--            季度-->
        ROUND((
        ifnull(SUM(月), 0) +
        ifnull(SUM(月), 0) +
        ifnull(SUM(月), 0)
        ), 2) as 1季度,
        ROUND((
        ifnull(SUM(月), 0) +
        ifnull(SUM(月), 0) +
        ifnull(SUM(月), 0)
        ), 2) as 2季度,
        ROUND((
        ifnull(SUM(月), 0) +
        ifnull(SUM(月), 0) +
        ifnull(SUM(月), 0)
        ), 2) as 3季度,
        ROUND((
        ifnull(SUM(月), 0) +
        ifnull(SUM(月), 0) +
        ifnull(SUM(月), 0)
        ), 2) as 4季度,
        <!--        总额度-->
        ROUND(IFNULL(SUM(所有的月加一起), 0), 2)
        AS 总额度
        FROM 表名 as base
        INNER JOIN(
        SELECT 
        表名.id,
        表名.类型,
        表名.code,
        表名.年,
        IFNULL(月, 0)      AS 月,
        IFNULL(月, 0)      AS 月,
        IFNULL(月, 0)      AS 月,
        IFNULL(月, 0)      AS 月,
        IFNULL(月, 0)      AS 月,
        IFNULL(月, 0)      AS 月,
        IFNULL(月, 0)      AS 月,
        IFNULL(月, 0)      AS 月,
        IFNULL(月, 0)      AS 月,
        IFNULL(月, 0)      AS 月,
        IFNULL(月, 0)      AS 月,
        IFNULL(月, 0)		AS 月,
        IFNULL(月, 0)    	AS 月

        FROM 表名 as data

        INNER JOIN 公司行业 AS 行业ON 行业.企业id = ent_id
        and industry.type = 1
        <!--        查询用电-->
        <if test="electricList != null and electricList.size() != 0">
            left join (select *
            from data where data.year = #{year}
            and data.type =类型                                       and (
            <foreach item="itm" collection="electricList" separator="or">
                data.total ${itm}
            </foreach>
            )
            ) as 别名  on 别名.id = entdata.id
        </if>

        <!-- 查询社保人数-->
        <if test="socialList != null and socialList.size() != 0">
            left join (
            select *
            from data where data.year = #{year}
            and data.type = 类型
            and (
            <foreach item="itm" collection="socialList" separator="or">
                data.total ${itm}
            </foreach>
            )
            ) as 别名 on 别名.id = entdata.id
        </if>

        <!--查询缴税额-->
        <if test="payTaxesList != null and payTaxesList.size() != 0">
            left join (
            select *
            from ent_data where ent_data.year = #{year}
            and ent_data.type = 类型
            and (
            <foreach item="itm" collection="payTaxesList" separator="or">
                ent_data.total ${itm}
            </foreach>
            )
            ) as 别名
            on 别名.id = entdata.id
        </if>


        )as 别名 on 别名.ent_id = base.id


        GROUP BY 分组
    </select>