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实现简易随机点名功能
定时器的工作原理,这里将用引用How JavaScript Timers Work中的例子来解释定时器的工作原理,该图为一个简单版的原理图.· 上图中,左侧数字代表时间,单位毫秒:左侧文字代表某一个操 ...
- 跟随一条insert语句, 进入TiDB的源码世界(上)
TiDB是Google F1的开源实现: TiDB实现了基于mvcc的乐观锁,在线表结构变更,基于时间戳的数据线性一致性,等等: 为了可靠性,TiDB和Oracle一样,维护了百万级别的自动化测试用例 ...
- 【原创】导出aws ec2为csv
1.安装 pip install boto3 csv 2.使用脚本更新秘钥和地区 # 导出aws ec2列表为cvs import boto3 import csv ec2 = boto3.cl ...
- java生成临时文件夹和删除临时文件夹
为了不生成同名的文件夹 String s = UUID.randomUUID().toString(); String filepath = ServletActionContext.getServl ...
- Arrays.toString的作用
Arrays.toString()的作用是用来很方便地输出数组,而不用一个一个地输出数组中的元素. 这个方法是是用来将数组转换成String类型输出的,入参可以是long,float,double,i ...
- 物聯網安全黑客松 IoT Security and Privacy Hackathon
感覺這次黑客松的程度屬於初階,但是節奏很快,內容緊湊.概念部分解說較多,以致實驗時間縮短,有些只能看demo有點遺憾.幸好有video-taped,事後回溯可以看看能不能replicate實驗.總體而 ...
- docker容器里面执行top报“TERM environment variable not set.”
解决: [hadoop@master ~]$ docker exec -ti 6eca7d27a988 /bin/bashroot@6eca7d27a988:/# topTERM environmen ...
- anzhuang ruanjian
makepkg -i https://github.com/arch4edu/arch4edu/wiki/Add-arch4edu-to-your-Archlinux Add arch4edu to ...
- javaWeb项目部署到阿里云服务器
1.云服务器中配置了jdk+eclipse+tomcat 2.将项目导出War到安装的Tomcat的webapps文件夹中: 右击项目->Export->WarFile->Desti ...
- 完全基于卷积神经网络的seq2seq
本文参考文献: Gehring J, Auli M, Grangier D, et al. Convolutional Sequence to Sequence Learning[J]. arXiv ...