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

具体例子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>
附加(带有重复数据表-显示【单条】【部分字段】)