美文网首页
Mysql横向数据转换为纵向数据

Mysql横向数据转换为纵向数据

作者: YUTerry | 来源:发表于2019-06-25 15:39 被阅读0次

工作中遇到的一个需求,大概是这样的

mysql查询到的数据如下
现在要把它转换为这种形式

我采用的方法是把每个公司卖的药和所占百分比整理成list,前端再字符串拼接成table

//测试数据,模拟sql返回数据
List<Map> list = new ArrayList<>();
        HashMap map1 = new HashMap();
        map1.put("classId",3);
        map1.put("className","风湿骨痛");
        map1.put("companyId",1);
        map1.put("companyName","大参林");
        map1.put("number",4);
        map1.put("goodsName","云南白药");

        HashMap map2 = new HashMap();
        map2.put("classId",3);
        map2.put("className","风湿骨痛");
        map2.put("companyId",2);
        map2.put("companyName","同仁堂");
        map2.put("number",3);
        map2.put("goodsName","云南白药");

        HashMap map3 = new HashMap();
        map3.put("classId",2);
        map3.put("className","成人用品");
        map3.put("companyId",1);
        map3.put("companyName","大参林");
        map3.put("number",7);
        map3.put("goodsName","排卵试纸");

        HashMap map4 = new HashMap();
        map4.put("classId",1);
        map4.put("className","个人护理");
        map4.put("companyId",3);
        map4.put("companyName","一树");
        map4.put("number",2);
        map4.put("goodsName","妇炎洁");

        list.add(map1);
        list.add(map2);
        list.add(map3);
        list.add(map4);

整理数据 :

        // 获得所有药品的分类
        List<String> cl = new ArrayList<>();
        for (Map m : list) {
            cl.add(m.get("classId").toString());
        }
        //种类去重
        cl = cl.stream().distinct().collect(Collectors.toList());
        // 获取此药品在每个商户的销售数量
        List<Map> result = new ArrayList<>();
        for (String c : cl) {
            List<Map> goodlist = new ArrayList<>();
            for (Map m : list) {
                if (m.get("classId").toString().equals(c)) {
                    goodlist.add(m);
                }
            }
            // 药品总数量
            Integer i = 0;
            for (Map gl : goodlist) {
                i += Integer.valueOf(gl.get("number").toString());
            }
            // 各百分比
            for (Map gl : goodlist) {
                Double sq = Double.valueOf(gl.get("number").toString());
                double ratio = sq / i;
                HashMap<String, Object> mm = new HashMap<>();
                //百分比
                mm.put("ratio", String.format("%.0f", ratio * 100) + "%(" + gl.get("number") + ")");
                mm.put("companyId", gl.get("companyId"));
                mm.put("companyName", gl.get("companyName"));
                mm.put("classId", gl.get("classId"));
                mm.put("className", gl.get("className"));
                result.add(mm);
            }
        }

看一下数据


拼接成Table,这里简单演示

// 获得所有商户
        List<String> merList = new ArrayList<>();
        for (Map m : list) {
            merList.add(m.get("companyName").toString());
        }
        // 去重
        merList = merList.stream().distinct().collect(Collectors.toList());

        // 获得所有药品名
        List<String> cls = new ArrayList<>();
        for (Map m : list) {
            cls.add(m.get("className").toString());
        }
        // 去重
        cls = cls.stream().distinct().collect(Collectors.toList());

        StringBuffer td = new StringBuffer();
        for (int k = 0; k < merList.size(); k++) {
            String  com = merList.get(k);
            td.append("<tr>");
            td.append("<td>").append(com).append("</td>");
            for (int o = 0; o < cls.size(); o++) {
                for (int i = 0; i < result.size(); i++) {
                    if (result.get(i).get("className").equals(cls.get(o)) && result.get(i).get("companyName").equals(com)) {
                        td.append("<td>").append(result.get(i).get("ratio")).append("</td>");
                        break;
                    }
                    if (result.get(i).get("companyName").equals(cls.get(o))) {
                        if (result.get(i).get("companyName") != com) {
                            if (i != result.size() - 1) {
                                continue;
                            } else {
                                td.append("<td>").append("0%(0)").append("</td>");
                                break;
                            }
                        }
                    }
                    if (i == result.size() - 1) {
                        td.append("<td>").append("0%(0)").append("</td>");
                    }
                }
            }
            td.append("</tr>");
        }

结果展示

相关文章

  • Mysql横向数据转换为纵向数据

    工作中遇到的一个需求,大概是这样的 我采用的方法是把每个公司卖的药和所占百分比整理成list,前端再字符串拼接成t...

  • SPSS数据分析从零开始(8)多个文件的合并

    SPSS数据文件的合并方式有两种:纵向拼接和横向合并。 纵向拼接:指的是几个数据集中的数据纵向相连,组成一个新的数...

  • Python 矩阵拼接

    使用 dumpy 的concatenate() 纵向拼接 举例数据 默认纵向拼接 横向拼接 设置axis=1

  • Excel横向纵向数据转换

    Excel横向纵向如何转换呢?先选中横向的数据单元格,右击选择,然后右击空白单元格,选择粘贴选项中的转置,这样便横...

  • MySQL 行列转置

    建立测试表: 原始数据: 需要转置为: 即:将 事件名(event_name)作为纵向表头,日期(dt)作为横向表...

  • Lesson 2 数据集的管理

    Lesson 2 数据集的管理 1 纵向合并与横向合并 纵向合并 s1 s2 s 横向合并 m1 m2 m 延伸:...

  • Java高并发-数据库切库、分库、分表

    数据库瓶颈: 多个数据源的支持 横向(水平)分表纵向(垂直)分表数据分表:mybatis分表插件sharebati...

  • 19 高并发之数据库切库 分库 分表

    数据库瓶颈: 多个数据源的支持 横向(水平)分表纵向(垂直)分表数据分表:mybatis分表插件sharebati...

  • 3、pandas数据重构

    1、使用concat做数据合并 1.1、横向合并 1.2、纵向合并 2、使用group对数据进行聚合及运算 一图看...

  • 数据分析

    数据分析基本方法 对比分析(横向对比纵向对比) 趋势分析 象限分析 交叉分析 数据分析框架_AARRR分析 逻辑分...

网友评论

      本文标题:Mysql横向数据转换为纵向数据

      本文链接:https://www.haomeiwen.com/subject/miamqctx.html