同一表中数据统计, 重复只显示一条, 根据一个字段显示多个统计结果;

从下面的表中根据标示统计出下面的页面效果, 本想用一条 sql 试了半天, 除了分组子查询都不行, 还是通过程序来解决这类问题;

select t.workid,count(t.workid),t.status from t_st_kflist t where 1=1 group by t.workid,t.status;

共计3条数据;

搞了半天还是不可以, 看来 sql 是解决不聊了;

要求: 表中的workID即工号可以有多条(可以相同), 但是到了页面上显示就必须只能有一个workID, 每个相同的status进行叠加;

分析: 既然 workID不变 , 不论多少个workID最终都显示一条同时相同的状态进行叠加已达到统计效果, Map 有个有个特点即,

    key不可重复如果重复 value 将被最后一个put进入的值替换, 到这里问题已经基本解决, 接下来就是数据怎么存到map中

才具有下面的页面显示效果 将workID作为键, value 是动态增加的同时还需要区分不同status表示的含义好办我可以使用

一个Map作为值;

java code:

package com.piaomeng.b2bv5.stat.controller;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.piaomeng.b2bv5.core.auth.AuthPassport;
import com.piaomeng.b2bv5.stat.po.KfOrderInfo;
import com.piaomeng.b2bv5.stat.service.IKfOrderService;
import com.piaomeng.b2bv5.util.StringUtil;

@Controller
@Scope("prototype")
@RequestMapping("/statistics")
public class KfListController {
    @Autowired
    private IKfOrderService iKfOrderService;
    @RequestMapping("/selectKfList")
    @AuthPassport(auth="/statistics/selectKfList", check=false)
    public String selectKfList(Map<String,Object> map, KfOrderInfo koi, HttpServletRequest request,
            String beginDate,String endDate, String beginLogDate2,String endLogDate2){

    if (koi != null) {
        map.put("beginDate", beginDate);
        map.put("endDate", endDate);
        map.put("workid", koi.getWorkid());
    }
    List<KfOrderInfo> lists = iKfOrderService.selectList(map);
    Map<String, Map<String, Object>> parent = new HashMap<String, Map<String,Object>>();
    Map<String, Object> children = new HashMap<String, Object>();
    /**
     * 状态: 10 等待出票 11 出票处理中 16更换编码 30废票 20正常退票 22无法退票 32无法废票 40申请改期 42无法改期 12出票失败 90平台退款
     */
    int wt = 0, ta = 0, ca = 0, it = 0, nrt = 0, cnrt = 0, cnit = 0, tafr = 0, cbr = 0, tdf = 0, pfr = 0;
    if (lists.size() > 0 && lists != null) {
        for (KfOrderInfo item : lists) {

            String status = item.getStatus();
            if (StringUtil.notEmpty(status)) {
                if (status.equals("10")) {// 10 等待出票
                    wt++;
                    children.put("wt", wt);
                }else if (status.equals("11")) {// 11 出票处理中
                    ta++;
                    children.put("ta", ta);
                }else if (status.equals("16")) {// 16更换编码
                    ca++;
                    children.put("ca", ca);
                }else if (status.equals("30")) {// 30废票
                    it++;
                    children.put("it", it);
                }else if (status.equals("20")) {// 20正常退票
                    nrt++;
                    children.put("nrt", nrt);
                }else if (status.equals("22")) {// 22无法退票;
                    cnrt++;
                    children.put("cnrt", cnrt);
                }else if (status.equals("32")) {// 32无法废票;
                    cnit++;
                    children.put("cnit", cnit);
                }else if (status.equals("40")) {// 40申请改期
                    tafr++;
                    children.put("tafr", tafr);
                }else if (status.equals("42")) {// 42无法改期
                    cbr++;
                    children.put("cbr", cbr);
                }else if (status.equals("12")) {// 12出票失败
                    tdf++;
                    children.put("tdf", tdf);
                }else if (status.equals("90")) {// 90平台退款
                    pfr++;
                    children.put("pfr", pfr);
                }
            }else {
                children.put("wt", wt);
                children.put("ta", ta);
                children.put("ca", ca);
                children.put("it", it);
                children.put("nrt", nrt);
                children.put("cnrt", cnrt);
                children.put("cnit", cnit);
                children.put("tafr", tafr);
                children.put("cbr", cbr);
                children.put("tdf", tdf);
                children.put("pfr", pfr);
            }
            parent.put(item.getWorkid(), children);

        }
    }

    map.put("kfis", parent);
    map.put("workid", koi.getWorkid());// 搜索回显;
        return "/jsp/stat/kfworkday";
    }
}

页面使用的jsp所以咯el表达式:

<table class="caozuo" cellpadding="0" cellspacing="0" border="1">
                    <tr>
                        <th>工号</th>
                        <th>等待出票</th>
                        <th>出票处理中</th>
                        <th>更换编码</th>
                        <th>废票</th>
                        <th>正常退票</th>
                        <th>无法退票</th>
                        <th>无法废票</th>
                        <th>改期</th>
                        <th>无法改期</th>
                        <th>出票失败</th>
                        <th>平台退款</th>
                    </tr>
                    <j:choose>
                        <j:when test="${kfis.size() > 0 && not empty kfis }">
                        <j:forEach items="${kfis.keySet() }" var="key" varStatus="countStatus">
                            <tr>
                                <td>${key }</td>
                                <td>${kfis.get(key).get("wt") }<j:if test="${empty kfis.get(key).get(‘wt‘)}">0</j:if></td>
                                <td>${kfis.get(key).get("ta") }<j:if test="${empty kfis.get(key).get(‘ta‘)}">0</j:if></td>
                                <td>${kfis.get(key).get("ca") }<j:if test="${empty kfis.get(key).get(‘ca‘)}">0</j:if></td>
                                <td>${kfis.get(key).get("it") }<j:if test="${empty kfis.get(key).get(‘it‘)}">0</j:if></td>
                                <td>${kfis.get(key).get("nrt") }<j:if test="${empty kfis.get(key).get(‘nrt‘)}">0</j:if></td>
                                <td>${kfis.get(key).get("cnrt") }<j:if test="${empty kfis.get(key).get(‘cnrt‘)}">0</j:if></td>
                                <td>${kfis.get(key).get("cnit") }<j:if test="${empty kfis.get(key).get(‘cnit‘)}">0</j:if></td>
                                <td>${kfis.get(key).get("tafr") }<j:if test="${empty kfis.get(key).get(‘tafr‘)}">0</j:if></td>
                                <td>${kfis.get(key).get("cbr") }<j:if test="${empty kfis.get(key).get(‘cbr‘)}">0</j:if></td>
                                <td>${kfis.get(key).get("tdf") }<j:if test="${empty kfis.get(key).get(‘tdf‘)}">0</j:if></td>
                                <td>${kfis.get(key).get("pfr") }<j:if test="${kfis.get(key).get(‘pfr‘) == null}">0</j:if></td>
                           </tr>
                        </j:forEach>
                        </j:when>
                        <j:otherwise>
                            <tr><td colspan="12">当前记录为空</td></tr>
                        </j:otherwise>
                    </j:choose>
                </table>

最终效果:

时间: 2024-08-27 21:32:49

同一表中数据统计, 重复只显示一条, 根据一个字段显示多个统计结果;的相关文章

oracle删除一个表中的重复数据,且只保留一条

例子1:查找一个表中的重复数据,重复记录是根据单个字段(Id)来判断,表名为STUDENT SELECT ID , COUNT(1) FROM STUDENT T GROUP BY T.ID HAVING COUNT(ID) > 1 例子2:删除表中多余的重复记录,重复记录是根据单个字段(Id)来判断,只留有rowid最小的记录,表名为STUDENT DELETE FROM STUDENT WHERE ID IN (SELECT ID FROM STUDENT T GROUP BY T.ID H

Sql server的Merge语句,源表中如果有重复数据会导致执行报错

用过sql server的Merge语句的开发人员都应该很清楚Merge用来做表数据的插入/更新是非常方便的,但是其中有一个问题值得关注,那就是Merge语句中的源表中不能出现重复的数据,我们举例来说明这个问题. 现在我们有一张表叫T_Class_A,其建表语句如下: CREATE TABLE [dbo].[T_Class_A]( [ID] [int] IDENTITY(1,1) NOT NULL, [ClassName] [nvarchar](50) NULL, [StudentTotalCo

SQL语句中使用 with 递归实现表中数据树状显示

在开发过程中会遇到很多实现树状的功能,之前为了实现数据的树状显示一般都是通过程序里面的递归实现,今天试了一下通过sql语句实现具体如下: 表名:DeptInfo 字段:DeptId(部门编号),DeptName(部门名称),DeptUpId(部门上级ID),DeptPath(部门层级) 从DeptUpId和DeptPath中可看出表数据可能很乱: 为了实现表中数据树状显示,条例清晰具体代码实现如下: with dept as(select DeptId,DeptUpId from DeptInf

mysql insert插入时实现如果数据表中主键重复则更新,没有重复则插入的四种方法

[CSDN下载] Powerdesigner 设计主键code不能重复等问题 [CSDN博客] Oracle中用一个序列给两个表创建主键自增功能的后果 [CSDN博客] MySQL自增主键删除后重复问题 [CSDN博客] mysql 主从复制 双主从复制原理 防止主键重复问题(必看) [CSDN博客] replace into导致mysql自增列导致主键重复问题分析 [CSDN博客] 一个循环更新某库所有表所有非主键列的值方法(sql 2005 & mysql) [CSDN博客] mysql i

删除oracle表中的完全重复数据

今天数据库除了个问题:项目中的一张表,数据是从另外一个系统中相同的表里弄过来的,但是可能由于昨天同事导数据导致我这张表中的数据出现了完全相同的情况(所有字段),全部是两条,需要删除相同的数据. 做法:1.创建中间表, 2.将原表中的不重复数据放入中间表, 3.删除原表数据 4.将中间表数据放入原表 5.删除中间表 --创建中间表 CREATE TABLE ATT_SCATTER_REQ_NUM_TEMP AS (SELECT distinct * FROM ATT_SCATTER_REQ_NUM

Oracle 数据库表中已有重复数据添加唯一键(唯一约束)

Oracle 数据库表中已有重复数据添加唯一键(唯一约束) 问题描述 以 demo 举例,模拟真实场景. 表 TEST_TABLE 有如下字段和数据:id 是主键,code 没有设置键和索引 ID CODE 1 code1 2 code2 3 code2 4 code2 5 code3 通过以上表中数据可以看出 code 是有重复数据的,此时如果我们直接添加唯一键,会报错. 通过 PL/SQL 可视化操作,或者通过 SQL 语句添加(ENABLE NOVALIDATE 的作用是约束新增数据但不会

MySQL查询数据表中数据记录(包括多表查询)

MySQL查询数据表中数据记录(包括多表查询) MySQL查询数据表中数据记录(包括多表查询) 转自:http://www.baike369.com/content/?id=5355 在MySQL中创建数据库的目的是为了使用其中的数据. 使用select查询语句可以从数据库中把数据查询出来. select语句的语法格式如下: select selection_list // 要查询的内容,选择哪些列 from table_list // 从什么表中查询,从何处选择行 where primary_

mysql--对行(表中数据)的增删改查

一.插入数据(增加)insert 1.插入数据(顺序插入) 语法一: INSERT INTO 表名(字段1,字段2,字段3-字段n) VALUES(值1,值2,值3-值n); #指定字段来插入数据,插入的值要和你前面的字段相匹配 语法二: INSERT INTO 表名 VALUES (值1,值2,值3-值n); #不指定字段的话,就按照默认的几个字段来插入数据 2.指定字段插入数据 语法: INSERT INTO 表名(字段1,字段2,字段3-) VALUES (值1,值2,值3-); 3.插入

SqlServer将表中数据复制到另一张表

insert into phone2(ph,attr,type,carrier) select top 1000 ph,attr,type,carrier from phone 将表phone的字段和前1000条数据复制到Phone2表 数据库中的某个表删除重复数据(phone2表不能存在) select distinct  * into phone2 from phone 表phone的数据放到phone2中(phone2表可以存在) insert into phone2(ph,attr,ty