Mysql统计每年每个月的数据——详细教程
Mysql统计每年每个月的数据(前端页面统计图实现)
最终想实现的效果图,在这里就不多废话了,直接上效果图,由于测试数据有几个月是为0的,所以数据图看着会有点怪怪。

接下来是数据库的两个表,这里直接给你们代码了,你们根据自己的需求更改即可
-- 会员充值表
CREATE TABLE rechargeinfo(
r_num INT PRIMARY KEY COMMENT '充值编号',
v_card VARCHAR(12) COMMENT '会员卡号',
r_recharge DOUBLE COMMENT '充值金额',
r_payway VARCHAR(20) COMMENT '支付方式',
o_id INT COMMENT '操作员工编号',
r_time DATETIME COMMENT '交易时间',
r_remark VARCHAR(50) COMMENT '交易备注',
FOREIGN KEY (o_id) REFERENCES operatorinfo(o_id)
)ENGINE = InnoDB COMMENT '会员充值信息表';
alter table rechargeinfo change r_time r_time timestamp not null default NOW(); --停车登记表 CREATE TABLE parkinginfo(
p_num INT PRIMARY KEY COMMENT '停车编号',
c_carplate VARCHAR(20) NOT NULL COMMENT '车牌号',
p_card VARCHAR(20) COMMENT '停车牌号',
p_picture VARCHAR(50) COMMENT '进场拍摄图',
p_entrytime Date COMMENT '进场时间',
p_leavetime Date COMMENT '出场时间',
p_type VARCHAR(10) COMMENT '客户类型',
p_cost Double COMMENT '停车费用',
p_payway VARCHAR(20) COMMENT '支付方式',
v_card VARCHAR(12) COMMENT '会员卡号',
v_phone VARCHAR(12) COMMENT '临时客户手机号码',
p_condition VARCHAR(20) DEFAULT '正在停车中' COMMENT '状态',
p_remark VARCHAR(50) COMMENT '备注' )ENGINE = InnoDB COMMENT '停车信息表';
alter table parkinginfo change p_entrytime p_entrytime timestamp not null default NOW();
接下来就是重点了:
SQL语句,只需要传入一个参数(年份)即可, 这个是统计会员充值表的,另一张表同理
select
sum(case month(r_time) when '' then r_recharge else 0 end) as Jan,
sum(case month(r_time) when '' then r_recharge else 0 end) as Feb,
sum(case month(r_time) when '' then r_recharge else 0 end) as Mar,
sum(case month(r_time) when '' then r_recharge else 0 end) as Apr,
sum(case month(r_time) when '' then r_recharge else 0 end) as May,
sum(case month(r_time) when '' then r_recharge else 0 end) as June,
sum(case month(r_time) when '' then r_recharge else 0 end) as July,
sum(case month(r_time) when '' then r_recharge else 0 end) as Aug,
sum(case month(r_time) when '' then r_recharge else 0 end) as Sept,
sum(case month(r_time) when '' then r_recharge else 0 end) as Oct,
sum(case month(r_time) when '' then r_recharge else 0 end) as Nov,
sum(case month(r_time) when '' then r_recharge else 0 end) as Dece
from rechargeinfo
where year(r_time)='';
效果图:可以看到,每个月的数据已经查出来了

接下来给出的是Dao层代码,service层就不写了,是个程序员,dao层知道,service都会写
import java.util.Map;
public interface TotalDao {
Map<String,Double> getRechargeTotal(String toyear);
Map<String,Double> getParkingTotal(String toyear);
}
以及Mapper文件代码:注意,这里的结果类型一定要是java.util.LinkedHashMap, 如果是HashMap,是不会报错,但是顺序会乱,So,,你懂得。
<!-- 统计充值-->
<select id="getRechargeTotal" parameterType="String" resultType="java.util.LinkedHashMap">
select
sum(case month(r_time) when '1' then r_recharge else 0 end) as Jan,
sum(case month(r_time) when '2' then r_recharge else 0 end) as Feb,
sum(case month(r_time) when '3' then r_recharge else 0 end) as Mar,
sum(case month(r_time) when '4' then r_recharge else 0 end) as Apr,
sum(case month(r_time) when '5' then r_recharge else 0 end) as May,
sum(case month(r_time) when '6' then r_recharge else 0 end) as June,
sum(case month(r_time) when '7' then r_recharge else 0 end) as July,
sum(case month(r_time) when '8' then r_recharge else 0 end) as Aug,
sum(case month(r_time) when '9' then r_recharge else 0 end) as Sept,
sum(case month(r_time) when '10' then r_recharge else 0 end) as Oct,
sum(case month(r_time) when '11' then r_recharge else 0 end) as Nov,
sum(case month(r_time) when '12' then r_recharge else 0 end) as Dece
from rechargeinfo
where year(r_time)=#{toyear};
</select> <!--统计停车-->
<select id="getParkingTotal" parameterType="String" resultType="java.util.LinkedHashMap">
select
sum(case month(p_leavetime) when '1' then p_cost else 0 end) as Jan,
sum(case month(p_leavetime) when '2' then p_cost else 0 end) as Feb,
sum(case month(p_leavetime) when '3' then p_cost else 0 end) as Mar,
sum(case month(p_leavetime) when '4' then p_cost else 0 end) as Apr,
sum(case month(p_leavetime) when '5' then p_cost else 0 end) as May,
sum(case month(p_leavetime) when '6' then p_cost else 0 end) as June,
sum(case month(p_leavetime) when '7' then p_cost else 0 end) as July,
sum(case month(p_leavetime) when '8' then p_cost else 0 end) as Aug,
sum(case month(p_leavetime) when '9' then p_cost else 0 end) as Sept,
sum(case month(p_leavetime) when '10' then p_cost else 0 end) as Oct,
sum(case month(p_leavetime) when '11' then p_cost else 0 end) as Nov,
sum(case month(p_leavetime) when '12' then p_cost else 0 end) as Dece
from parkinginfo
where year(p_leavetime)=#{toyear} and p_condition='交易完成' ;
</select> </mapper>
Control层:
//统计页面
@RequestMapping("/totalui")
public ModelAndView test(@RequestParam(value ="toyear",required = false,defaultValue = "2019")String toyear){
ModelAndView mv = new ModelAndView();
// get all data
Map<String, Double> rechargeTotal = service.getRechargeTotal(toyear);
Map<String,Double> pachargeTotal = service.getParkingTotal(toyear);
// test
System.out.println("测试所有数据: "+rechargeTotal.values()+" ");
System.out.println("测试所有数据 : "+ pachargeTotal.values()+" "); // 统计
Map<String,Double> datatotal = new LinkedHashMap<>();
for(String key:rechargeTotal.keySet()){
if(pachargeTotal.containsKey(key)){
datatotal.put(key, rechargeTotal.get(key)+pachargeTotal.get(key));
}
}
System.out.println("合并后的数据!!!"+datatotal.values()); // set atrr
mv.addObject("redata",rechargeTotal.values());
mv.addObject("padata",pachargeTotal.values());
mv.addObject("totaldata",datatotal.values());
mv.setViewName("Income");
return mv; }
前端页面显示图代码:
<script>
var chart = Highcharts.chart('container', {
chart: {
type: 'column'
},
title: {
text: '洱海湾停车场营业额统计'
}, legend: {
align: 'right',
verticalAlign: 'middle',
layout: 'vertical'
},
xAxis: {
categories: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'],
labels: {
x: -10
}
},
yAxis: {
allowDecimals: false,
title: {
text: '金额'
}
},
series: [{
name: '会员充值收入',
data: ${redata}
}, {
name: '停车收入',
data: ${padata}
}, {
name: '合计收入',
data: ${totaldata}
}],
responsive: {
rules: [{
condition: {
maxWidth: 1500
},
chartOptions: {
legend: {
align: 'center',
verticalAlign: 'bottom',
layout: 'horizontal'
},
yAxis: {
labels: {
align: 'left',
x: 0,
y: -5
},
title: {
text: '¥金额以元为单位'
}
},
subtitle: {
text: null
},
credits: {
enabled: false
}
}
}]
}
}); </script>
大功告成,不懂得可以直接评论咨询!!!!!
Mysql统计每年每个月的数据——详细教程的更多相关文章
- Linux CentOS6.5下编译安装MySQL 5.6.16【给力详细教程】
一.编译安装MySQL前的准备工作 安装编译源码所需的工具和库 yum install gcc gcc-c++ ncurses-devel perl 安装cmake,从http://www.cmake ...
- 简单Sql语句统计每年每个月的数据,每个月为数据的每列,简单SQL练习
有一张表,数据如下 请写出结果为以下的SQL语句. 在mysql中创建表 CREATE TABLE `aa` ( `id` int(10) NOT NULL AUTO_INCREMENT COMME ...
- MySQL解压版配置步骤详细教程
解压mysql到D盘根目录 在解压路径下复制my-default.ini,修改名称为my.ini 在my.ini内容如下 [client]default-character-set=utf8 [mys ...
- Java读取Excel指定列的数据详细教程和注意事项
本文使用jxl.jar工具类库实现读取Excel中指定列的数据. jxl.jar是通过java操作excel表格的工具类库,是由java语言开发而成的.这套API是纯Java的,并不依赖Windows ...
- mysql统计前24小时数据没有补0
SELECT t1. HOUR HOUR, COUNT(t2. HOUR) count FROM ( SELECT DATE_FORMAT( HOUR), '%y-%m-%d %H' ) HOUR F ...
- MySQL 8.0.12 基于Windows 安装教程(超级详细)
MySQL 8.0.12 基于Windows 安装教程(超级详细) (一步一步来,装不了你找我!) 本教程仅适用Windows系统,如果你原本装了没装上,一定要先删除原本的数据库,执行:mysqld ...
- Ubuntu 搭建Web服务器(MySQL+PHP+Apache)详细教程
Ubuntu 搭建Web服务器(MySQL+PHP+Apache)详细教程 看了好多人的博客,有的不全 or 有问题,整理了一下,适合小白 新手先整理几个小问题 1.为啥使用 Linux 搭建服务器? ...
- Windows(x86,64bit)升级MySQL 5.7.17免安装版的详细教程
MySQL需要升级到5.5.3以上版本才支持Laravel 5.4默认的utf8mb64字符编码.因此就把MySQL升级了一下,期间还是遇到些小问题,记录一下以供参考. 升级准备 备份之前MySql目 ...
- .NET 5/.NET Core使用EF Core 5连接MySQL数据库写入/读取数据示例教程
本文首发于<.NET 5/.NET Core使用EF Core 5(Entity Framework Core)连接MySQL数据库写入/读取数据示例教程> 前言 在.NET Core/. ...
随机推荐
- 使用JS动态操作css的集中方法
内联样式 在咱们深入一些复杂的知识之前,先回来顾一下一些基础知识.例如,咱们可以通过修改它的.style属性来编辑给定的HTMLElement的内联样式. const el = document.cr ...
- IDEA2018创建SpringBoot无法连接https://start.spring.io
这是由于spring-boot需要访问https://start.spring.io外网,但是由于国内的局域网限制导致的. 解决办法: 进入到IDEA的setting 搜索 HTTP Proxy 选择 ...
- myeclipse关掉references
去掉下面两个勾选:
- PostgreSQL 学习手册-模式Schema
一个数据库包含一个或多个命名的模式,模式又包含表.模式还包含其它命名的对象,包括数据类型.函数,以及操作符.同一个对象名可以在不同的模式里使用而不会导致冲突: 比如,schema1和myschema都 ...
- SQLServer常见查询问题
http://bbs.csdn.net/topics/340078327 1.生成若干行记录 --自然数表1-1M CREATE TABLE Nums(n int NOT NULL PRIMAR ...
- 模拟I2C协议学习点滴之程序相关定义
由于主机和从机都会给数据线SDA发信号,比如主机先给SDA发送数据后,从机收到数据后发送应答信号将SDA拉低,故SDA类型设定为inout.而DATA设定为inout类型,是起到校验通信的作用(后续的 ...
- Codevs 4927 线段树练习5(分块)
4927 线段树练习5 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 有n个数和5种操作 add a b c:把区间[a,b]内的 ...
- dashucoding记录2019.6.6
div { display:flex; flex-direction:row-reverse; } -webkit-, - ms-或-moz- CSS语法 flex-direction: row|ro ...
- gcc/g++ 链接库的编译与链接
GCC编译步骤 gcc -E t1.c -o t1.i 预处理 gcc -S t1.i -o t1.s 转成汇编语言 gcc -c t1.s -o t1.o 转成机器码 gcc t1.o -o t1. ...
- 接口测试必学之curl命令
curl命令使用 curl命令 curl命令是服务器端调试接口最常用的命令,没有之一 curl测试GET接口 curl http://www.baidu.com url参数可以直接写到url中,此时u ...