日期动态合并行(rowspan)

这篇博客探讨了如何将两个结果集合并为一个,特别是在日期字段分组计数的情况下。文章通过具体的SQL查询示例展示如何操作,并详细解释了在页面逻辑中如何使用全局变量初始化和循环控制,以区分第一行和第二行的表格元素(td)。此外,还提到了其他处理方法和面对重复数据时的展示策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

两个结果集(所需要的字段和日期字段分组计数合并)成一个结果集

具体例子sql查询

<%!
		//查询课程安排信息
		public List getClassPlan(){
			StringBuffer sql=new StringBuffer();
			  sql.append("select tem1.*,tem2.countNum from (select to_char(cp.course_date,'yyyy-MM-dd') as cdate1,")
			     .append("to_char(cp.start_time,'hh:mi') as sdate,")
			     .append("to_char(cp.end_time,'hh:mi') as edate,")
			     .append("cp.name as tname,")
			     .append("cp.study_way as tsw,")
			     .append("cp.attach as tatt,")
			     .append("cp.remark as tre,")
				 .append("fti.name as tfname,")
				 .append("fti.department as tdepart,")
				 .append("fti.job as tjob ")
				 .append("from s_class_plan cp, s_class_plan_teacher cpt, fl_tea_info fti ")
				 .append("where cp.id = cpt.plan_id ")
				 .append("and cpt.teacher_id = fti.id order by cp.course_date,cp.end_time) tem1,")
				 .append("(select count(*) as countNum, to_char(cp.course_date, 'yyyy-MM-dd') as cdate2")
				 .append(" from s_class_plan cp,")
				 .append(" s_class_plan_teacher cpt,")
				 .append(" fl_tea_info fti")
				 .append(" where cp.id = cpt.plan_id")
				 .append(" and cpt.teacher_id = fti.id")
				 .append(" group by cp.course_date order by cp.course_date) tem2 where tem1.cdate1=tem2.cdate2");
					return DaoHelper.getResultSet(sql.toString(),11);
		}
%>



页面逻辑代码,运用全局变量的初始化和一次一次循环赋值比较来控制第一行与第二行的td区别


 <table width="100%" border="0" align="center" cellpadding="0" cellspacing="1" style="background:#ccc;">
		<tr>
			<td class="live_hd_zxzt_head">日期</td>
			<td class="live_hd_zxzt_head">时间</td>
			<td class="live_hd_zxzt_head">课程名称</td>    
			<td class="live_hd_zxzt_head">讲师</td>
			<td class="live_hd_zxzt_head">单位</td>
			<td class="live_hd_zxzt_head">职务/职称</td>
			<td class="live_hd_zxzt_head">学习方式</td>
			<td class="live_hd_zxzt_head">课件下载</td>
			<td class="live_hd_zxzt_head">备注</td>
		</tr>
		<%
					List classPlan=getClassPlan();
				  //培训课程list
				  String prefix_first = "";
					String prefix_second = "";
					for(int i=0;i<classPlan.size();i++){
					String [] info=(String[])classPlan.get(i);
		%>
	<tr>
					<%
							String rowspan = "";
							boolean flag = false;
							if(i==0){
								prefix_first = info[0];
								prefix_second = info[10];
								rowspan = "rowspan='"+info[10]+"'";
								flag = true;
							}
							//和上一次的比较而且不是第一个
							if(prefix_first.equals(info[0])&&prefix_second.equals(info[10])&&i!=0){
							
							}else{
									prefix_first = info[0];
									prefix_second = info[10];
									rowspan = "rowspan='"+info[10]+"'";
									flag = true;
							}		
							if(flag){
							%>
		<td class="pxb_hd_zxzt" <%=rowspan%> ><%=info[0]%></td>
							<%
							}	
							%>									
		<td class="pxb_hd_zxzt"><%=info[1]%>-<%=info[2]%>-<%=flag%> </td>
		<td class="pxb_hd_zxzt">  <%=info[3]%></td>
		<td class="pxb_hd_zxzt"><%=info[7]%></td>
		<td class="pxb_hd_zxzt"><%=info[8]%></td>
		<td class="pxb_hd_zxzt"><%=info[9]%></td>
		<td class="pxb_hd_zxzt"><%=info[4]%></td>
		<td class="pxb_hd_zxzt"><a href="#"><img src="../img/down.gif"></a></td>
		<td class="pxb_hd_zxzt"><%=info[6]%></td>
	</tr>
	<%
	}
	%>
</table>

效果图



另一种方法

  <body>
    <table border="1">
    	<tr>
    		<th>data</th>
    		<th>name</th>
    	</tr>
    	<% 
    		Map dateMap = getDateMap();
    		List dataList = getData();
    		for(int i = 0; i < dataList.size(); i++) {
    			String[] data = (String[])dataList.get(i);
    	%>
    	<tr>
    		<%=creatFirstTd(data, dateMap)%>
    		<td><%=data[1]%></td>
    	</tr>
    	<% 
    		}
    	%>
    </table>
  </body>
</html>
<%! 
	public String creatFirstTd(String[] data, Map dateMap) {
		String trStr = "";
		String rows = (String)dateMap.get(data[0]);
		if(rows != null) {
			trStr = "<td rowspan='"+rows+"'>"+data[0]+"</td>";
			dateMap.remove(data[0]);
		}
		return trStr;
	}
	
	private List getData() {
		List dataList = new ArrayList();
		dataList.add(new String[]{"2010-01-01", "aaa"});
		dataList.add(new String[]{"2010-01-01", "bbb"});
		dataList.add(new String[]{"2010-01-02", "ccc"});
		dataList.add(new String[]{"2010-01-03", "ddd"});
		dataList.add(new String[]{"2010-01-03", "eee"});
		return dataList;
	}
	
	public Map getDateMap() {
		Map map = new HashMap();
		map.put("2010-01-01", "2");
		map.put("2010-01-02", "1");
		map.put("2010-01-03", "2");
		return map;
	}
%>

最后一种

    <table border="0" align="center" cellpadding="0" cellspacing="1" width="99%" class="table" >
    <tr>
		<th width="60px" class="narrow">日期</th>
		<th width="60px" class="narrow">时间</th>
		<th width="125px" class="narrow">课程名称</th>
		<th width="55px" class="narrow">讲师</th>
        <th width="40px" class="narrow">单位</th>
        <th width="60px" class="narrow">职务/职称</th>
        <th width="60px" class="narrow">学习方式</th>
        <th width="30px" class="narrow">课件</th>
        <th width="30px" class="narrow">操作</th>
	</tr>
<%  
        int recordNum = planList.size();
        if(recordNum > 0){
        	String prevCourseDate = "";
        	String tdIdHead = "tdNum";
        	String removeStr = "";
        	int sameNum = 1;              //相同日期的数量        	
        	int thisNum = 1;                //当前要修改的编号
            for(int i=0; i<recordNum; i++){
        	    String[] planArr = (String[])planList.get(i);
%>
                <tr>                
<%              if("Y".equals(planArr[2])){   %>
           	    <td>自由</td>
           	    <td>自由</td>
<%        	    }else{
        	        if(prevCourseDate.equals(planArr[3])){
        	    	    sameNum += 1;
        	        }else{
        	    	    if(sameNum > 1){
        	    		    out.print("<script language=\"javascript\" >modifRowspan(\""+tdIdHead+thisNum+"\",\""+sameNum+"\");</script>");	
            	    	}                    
                        thisNum = i+1;
            	    	sameNum = 1;
%>
                        <td id="<%=tdIdHead %><%=i+1 %>" rowspan="1" ><%=planArr[3] %></td>
<%
        	        }
        	        prevCourseDate = planArr[3];
%>
                <td><%=planArr[4] %>-<%=planArr[5] %></td>
<%              
                }
				if( (i+1) == recordNum ){  //数据循环处理到最后一条时,最后重置最后一次的单元格合并
					out.print("<script language=\"javascript\" >modifRowspan(\""+tdIdHead+thisNum+"\",\""+sameNum+"\");</script>");
				}
%>
                <td class="t_left"><%=planArr[6] %></td>
                <td><%=null==planArr[11]?"":planArr[11] %></td>
                <td><%=null==planArr[12]?"":planArr[12] %></td>
                <td><%=null==planArr[13]?"":planArr[13] %></td>
                <td><%=learnStyle(planArr[7]) %></td>
<%              if(null != planArr[8] && null != planArr[9]){ %>
                <td><a href="mag_file_download.jsp?allStr=<%=CodeMixHelper.encodeString(tmpLogicPath,planArr[8],planArr[9])%>">下载</a></td>
<%              }else{ %>
                <td> 无</td>
<%              }      %>
                <td>
                    <a href="javascript:void(0)" onclick="updPlan(<%=planArr[0] %>)" >编辑</a><br/>
                    <a href="javascript:void(0)" onclick="delPlan(<%=planArr[0] %>)" >删除</a>
                </td>
            </tr>
<%
            }
        }else{
        	out.print("<tr><td colspan=\"10\">无符合条件的学习计划。</td></tr>");
        }
%>
    </table>



附加(带有重复数据表-显示【单条】【部分字段】)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值