一、主要工作:
1. 页面上显示的数据是:上报次数、有效数据;
上报次数 = 上报成功次数 + 上报失败次数
有效数据 = 上报成功次数
2. 页面上横头显示连续5天的数据:
2.1 最后一天是的[系统当前日期的昨天];
2.2 【日期选择框】中的日期,默认日期是[系统当前日期的昨天],
2.3 页面上,还增加3个按钮:前一天 今天 后一天,
点击【今天】按钮,【日期选择框】中的日期变为默认日期,页面显示的5天数据的最后一天是默认日期;
3. 除了列出所有游戏外,还应列出:【全部游戏】,数据即为:单个游戏的汇总;
二、技术通关:
1.Dao层:使用Spring JDBC读取数据库字段,其中因为5天数据与数据字段的特殊关系,可以使用case when 或 left join:
使用left join有一个弊端,因为表格是向左表看齐,所以如果左表select出来为空,则后面全部都是空的了,所以最好使用case when。
left join
select
t.product,
t.preiod_type,
t.preiod_type_value,
t.game,
t.game_server,
t.guild_upload_success_total,
t.guild_upload_fail_total,
t1.product,
t1.preiod_type_value,
t1.game,
t1.game_server,
t1.guild_upload_success_total,
t1.guild_upload_fail_total,
t2.product,
t2.preiod_type_value,
t2.game,
t2.game_server,
t2.guild_upload_success_total,
t2.guild_upload_fail_total,
t3.product,
t3.preiod_type_value,
t3.game,
t3.game_server,
t3.guild_upload_success_total,
t3.guild_upload_fail_total,
t4.product,
t4.preiod_type_value,
t4.game,
t4.game_server,
t4.guild_upload_success_total,
t4.guild_upload_fail_total
from overview_game_server t
left join(
select product,preiod_type_value,game,game_server,guild_upload_success_total,guild_upload_fail_total
from overview_game_server
where game_server='null' and preiod_type = 1
) t1 on t.preiod_type_value = DATE_SUB(t1.preiod_type_value,INTERVAL -1 DAY ) and t.game = t1.game and t.product=t1.product and t.game_server = t1.game_server
left join(
select product,preiod_type_value,game,game_server,guild_upload_success_total,guild_upload_fail_total
from overview_game_server
where game_server='null' and preiod_type = 1
) t2 on t.preiod_type_value = DATE_SUB(t2.preiod_type_value,INTERVAL -2 DAY ) and t.game = t2.game and t.product=t2.product and t.game_server = t2.game_server
left join(
select product,preiod_type_value,game,game_server,guild_upload_success_total,guild_upload_fail_total
from overview_game_server
where game_server='null' and preiod_type = 1
) t3 on t.preiod_type_value = DATE_SUB(t3.preiod_type_value,INTERVAL -3 DAY ) and t.game = t3.game and t.product=t3.product and t.game_server = t3.game_server
left join(
select product,preiod_type_value,game,game_server,guild_upload_success_total,guild_upload_fail_total
from overview_game_server
where game_server='null' and preiod_type = 1
) t4 on t.preiod_type_value = DATE_SUB(t4.preiod_type_value,INTERVAL -4 DAY ) and t.game = t4.game and t.product=t4.product and t.game_server = t4.game_server
where t.game_server='null' and t.preiod_type = 1 and t.product='yygame' and t.preiod_type_value = '2012-02-05';
使用case when
String queryString = "select " +
" product,game,preiod_type, " +
" max(case when preiod_type=1 and preiod_type_value=date_sub(:tdate, interval 0 day) then preiod_type_value else date_sub(:tdate, interval 0 day) end) as times0, " +
" max(case when preiod_type=1 and preiod_type_value=date_sub(:tdate, interval 0 day) then guild_upload_success_total else 0 end) as guild_upload_success_total, " +
" max(case when preiod_type=1 and preiod_type_value=date_sub(:tdate, interval 0 day) then guild_upload_fail_total else 0 end) as guild_upload_fail_total, " +
" max(case when preiod_type=1 and preiod_type_value=date_sub(:tdate, interval 1 day) then preiod_type_value else date_sub(:tdate, interval 1 day) end) as times1, " +
" max(case when preiod_type=1 and preiod_type_value=date_sub(:tdate, interval 1 day) then guild_upload_success_total else 0 end) as guild_upload_success_total1, " +
" max(case when preiod_type=1 and preiod_type_value=date_sub(:tdate, interval 1 day) then guild_upload_fail_total else 0 end) as guild_upload_fail_total1, " +
" max(case when preiod_type=1 and preiod_type_value=date_sub(:tdate, interval 2 day) then preiod_type_value else date_sub(:tdate, interval 2 day) end) as times2, " +
" max(case when preiod_type=1 and preiod_type_value=date_sub(:tdate, interval 2 day) then guild_upload_success_total else 0 end) as guild_upload_success_total2, " +
" max(case when preiod_type=1 and preiod_type_value=date_sub(:tdate, interval 2 day) then guild_upload_fail_total else 0 end) as guild_upload_fail_total2, " +
" max(case when preiod_type=1 and preiod_type_value=date_sub(:tdate, interval 3 day) then preiod_type_value else date_sub(:tdate, interval 3 day) end) as times3, " +
" max(case when preiod_type=1 and preiod_type_value=date_sub(:tdate, interval 3 day) then guild_upload_success_total else 0 end) as guild_upload_success_total3, " +
" max(case when preiod_type=1 and preiod_type_value=date_sub(:tdate, interval 3 day) then guild_upload_fail_total else 0 end) as guild_upload_fail_total3, " +
" max(case when preiod_type=1 and preiod_type_value=date_sub(:tdate, interval 4 day) then preiod_type_value else date_sub(:tdate, interval 4 day) end) as times4, " +
" max(case when preiod_type=1 and preiod_type_value=date_sub(:tdate, interval 4 day) then guild_upload_success_total else 0 end) as guild_upload_success_total4, " +
" max(case when preiod_type=1 and preiod_type_value=date_sub(:tdate, interval 4 day) then guild_upload_fail_total else 0 end) as guild_upload_fail_total4, " +
" max(case when preiod_type=1 and preiod_type_value=date_sub(:tdate, interval 5 day) then preiod_type_value else date_sub(:tdate, interval 5 day) end) as times5, " +
" max(case when preiod_type=1 and preiod_type_value=date_sub(:tdate, interval 5 day) then guild_upload_success_total else 0 end) as guild_upload_success_total5, " +
" max(case when preiod_type=1 and preiod_type_value=date_sub(:tdate, interval 5 day) then guild_upload_fail_total else 0 end) as guild_upload_fail_total5 " +
" from overview_game_server " +
" where preiod_type_value>= date_sub(:tdate, interval 5 day) and product=:product and preiod_type=1 and game_server='null' " +
" group by product,game "
;
2.数据库数据取出来后,使用
Map<String,Object> map = new HashMap<String,Object>();
map.put("tdate", date);
return getNamedParameterJdbcTemplate().queryForList(queryString.toString(),map);
返回一个List<Map<String,Object>>用于存储取出来的表格。
3.Controller层:Controller层实现对网页数据的输出,这里用到Spring的映射机制。
@RequestMapping
public String queryGuildGameUploadTotal(Date startDate,
HttpServletRequest request, ModelMap model) {
startDate = (Date) ObjectUtils.defaultIfNull(startDate,
DateUtils.addDays(DateUtil.getToday(), -1));
List<Map<String, Object>> dataList = overviewGameServerService
.listGuildGameUploadTotal(startDate);
model.put("dataList", dataList);
model.put("startDate", startDate);
addDateList2Model(startDate, model);
// sum
Map sumMap = MapCalcUtil.sumByMultiKeys(dataList, "guild_upload_success_total","guild_upload_fail_total",
"guild_upload_success_total1","guild_upload_fail_total1",
"guild_upload_success_total2","guild_upload_fail_total2",
"guild_upload_success_total3","guild_upload_fail_total3",
"guild_upload_success_total4","guild_upload_fail_total4");
sumMap.put("game", "全部游戏");//在game字段前添加全部游戏的<td>
dataList.add(0, sumMap);
return "overviewgameserver/queryGuildGameUploadTotal";
}
/**
* model.put("startDate" + (4-i), DateUtils.addDays(startDate, -i)); 使日期从低到高排序(注意对应数据库表的数据排序)
* @param startDate
* @param model
*/
private void addDateList2Model(Date startDate, ModelMap model) {
for (int i = 0; i < 5; i++) {
model.put("startDate" + (4-i), DateUtils.addDays(startDate, -i));
}
}
注:sumMap.put("game", "全部游戏");对应的是game字段。
public class MapCalcUtil {
public static Map<String,Double> sumByMultiKeys(List<Map<String,Object>> rows,String... keys) {
Map<String, Double> result = new HashMap<String, Double>();
for(String key : keys) {
double v = sum(rows, key);
result.put(key, v);
}
return result;
}
public static double sum(List<Map<String,Object>> rows,String key) {
double result = 0;
for(Map row : rows) {
Number number = (Number)row.get(key);
if(number != null) {
result += number.doubleValue();
}
}
return result;
}
}
4.前端显示,因为要做成一个连续5天的库表,前端显示的关键在于数据与显示时间匹配,还有注意的是数字的格式要为整数,要使用JSTL中的<fmt:formatNumber>
</fmt:formatNumber>,结合使用
<td><fmt:formatNumber value="${item['guild_upload_success_total4']}" pattern="####" /></td>
...
<td>...</td>
5.页面需要循环输出数据使用方法:
<c:forEach items="${yourMapping}" var="item" varStatus="index">
分享到:
相关推荐
在开发移动应用时,数据埋点是一项至关重要的工作,它能帮助我们收集用户行为数据,以便分析用户习惯、优化用户体验和提升产品性能。在uni-app框架中,uni-stat是一个专门用于实现这一目标的依赖文件。uni-app是一个...
总结来说,LoL-Champ-Stat-Calculator是一个综合运用了Java编程、数据处理和游戏数据分析技术的项目。它展示了如何将编程技术与游戏爱好相结合,为玩家提供实用的辅助工具。无论是对Java开发者还是对LoL玩家来说,这...
总结,Uber的cpustat项目为Linux性能监测提供了一个强大而灵活的工具,它的高频采样和轻量级特性使其成为开发者和运维人员的得力助手。通过深入了解和运用cpustat,我们可以更好地理解和优化Linux系统的性能,提升...
总结来说,LPC2294的I2C模块提供了与外部I2C设备通信的能力,通过合理的软件编程和硬件配置,可以在多种应用场景中实现高效的串行通信。结合周立功开发板的实践,开发者能够更好地理解和掌握I2C技术,并将其应用于...
【标题】"stat231-kzhou53" 指的可能是一个关于统计学231课程的个人学习项目或资源库,由用户kzhou53创建或维护。这个名称暗示了它可能包含了该课程相关的资料、作业、实验或者笔记。 【描述】"stat231-kzhou53" 的...
这些中断标志会存储在I2CSTAT寄存器中,可以根据需要启用或禁用相应的中断。 "Example16_I2C_H"文件可能包含了一个示例代码,展示了如何在TMS320F28335上设置和使用I²C模块与AT24C02通信的具体步骤。通过分析和...
总结,STAT318的最终项目通过实践操作,旨在深化学生对回归分析和统计模型的理解,提升他们在实际问题中运用这些工具的能力。通过这样的项目,学生不仅可以掌握理论知识,还能提升其在数据科学领域的实践技能。
- 如果存在`else`,解析`else`关键字并处理另一个语句`Stat2` 2. **Cond → Expression RelOp Expression** - 解析两个表达式`Expression`,得到三地址码 - 解析关系运算符`RelOp`(如`==`, `, `>`等) - 生成...
2. **程序数据图表程序窗口**:包括项目管理器窗口、数据窗口、绘图输出窗口等,方便用户管理和查看数据及分析结果。 #### 四、Minitab的实验设计功能 Minitab提供了丰富的实验设计功能,包括因子设计、响应曲面...
总结,Spring Boot结合Druid,能为你的Java项目带来高效稳定的数据库连接管理,同时提供丰富的监控功能,帮助开发者更好地理解和优化数据库性能。通过以上步骤,你可以轻松地在你的Spring Boot项目中集成并使用Druid...
总结来说,这个"kernel_stat.rar_Texas"项目是一个针对TI AM35x处理器的Linux内核适配层,包含的"am35x.c"和"kernel_stat.h"文件分别实现了硬件交互的逻辑和提供了相应的接口定义。这个项目对于那些需要在AM35x平台...
总结,WPF Prism的页面导航实例涉及了从启动到用户界面的各个层面,包括Bootstrapper的初始化、Shell的构建、模块化设计、Region的管理和Navigation的实现。通过理解并掌握这些概念,开发者可以构建出更加灵活、可...
- 选择后显示 **F3(ADD_)** 选项的项目,全部选中后按 **F3** 。 ##### 5. 定义设备 - 选中 **F3(DEF-DEV)** 显示如下画面。 - 按 **Next** ,选择 **F2(ADD-DEF)** 。 ##### 6. 添加设备列表 - 添加后出现类似...
它以其高度稳定、安全和可扩展性而备受赞誉,广泛应用于各种规模的企业和项目中。标题中的"PostgreSQL-11.1-1 Windows64位"指的是PostgreSQL的第11.1版本,专为64位Windows操作系统设计。 **1. PostgreSQL 11.1的...
总结,Git-stat 是一个高效实用的工具,利用GitHub API为开发者提供了一种直接、灵活的方式获取项目统计信息。通过Kotlin的实现,它保证了良好的性能和易用性,有助于提升开发者对项目管理的效率和透明度。无论是...
2. **`[_Info_]`**:此节通常为空或包含其他附加信息。 3. **`[_FileData_]`**:包含实际的SID数据,包括许可证信息、产品配置等。 - **$_Filename**:SID文件名,“setinit.sss”。 - **$_Path**:SID文件路径,...
总结,连接Linux下的MySQL数据库需要Java程序、JDBC驱动、MySQL服务器的正确配置以及合适的数据库用户权限。通过上述步骤,你可以成功地在Java程序中实现对MySQL数据库的连接。记住,安全性和性能优化也是开发中不可...
总结,QT结合Libssh2库实现SFTP下载涉及的知识点包括:QT编程基础、SFTP协议理解、Libssh2库的使用、VS环境配置、QT与第三方库的集成以及错误处理策略。通过这个过程,你可以掌握如何在C++环境下安全地实现远程文件...
- **Makefile简介**: Makefile 是一种用来自动构建复杂项目的脚本文件,通过定义依赖关系来控制构建过程。 - **基本结构**: 规则(Rule) + 变量(Variable) + 目标(Target) - **简单示例**: 对于上述提供的...
- **SAS/OR Project and Resource Scheduling**:项目资源调度。 - **SAS/OR Interactive Visualization and Simulation**:交互式模拟和可视化。 - **SAS/OR Local Search Optimization**:局部搜索优化算法。 - **...