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统计每年每个月的数据——详细教程的更多相关文章

  1. Linux CentOS6.5下编译安装MySQL 5.6.16【给力详细教程】

    一.编译安装MySQL前的准备工作 安装编译源码所需的工具和库 yum install gcc gcc-c++ ncurses-devel perl 安装cmake,从http://www.cmake ...

  2. 简单Sql语句统计每年每个月的数据,每个月为数据的每列,简单SQL练习

    有一张表,数据如下 请写出结果为以下的SQL语句. 在mysql中创建表 CREATE TABLE `aa` (  `id` int(10) NOT NULL AUTO_INCREMENT COMME ...

  3. MySQL解压版配置步骤详细教程

    解压mysql到D盘根目录 在解压路径下复制my-default.ini,修改名称为my.ini 在my.ini内容如下 [client]default-character-set=utf8 [mys ...

  4. Java读取Excel指定列的数据详细教程和注意事项

    本文使用jxl.jar工具类库实现读取Excel中指定列的数据. jxl.jar是通过java操作excel表格的工具类库,是由java语言开发而成的.这套API是纯Java的,并不依赖Windows ...

  5. mysql统计前24小时数据没有补0

    SELECT t1. HOUR HOUR, COUNT(t2. HOUR) count FROM ( SELECT DATE_FORMAT( HOUR), '%y-%m-%d %H' ) HOUR F ...

  6. MySQL 8.0.12 基于Windows 安装教程(超级详细)

    MySQL 8.0.12 基于Windows 安装教程(超级详细) (一步一步来,装不了你找我!) 本教程仅适用Windows系统,如果你原本装了没装上,一定要先删除原本的数据库,执行:mysqld ...

  7. Ubuntu 搭建Web服务器(MySQL+PHP+Apache)详细教程

    Ubuntu 搭建Web服务器(MySQL+PHP+Apache)详细教程 看了好多人的博客,有的不全 or 有问题,整理了一下,适合小白 新手先整理几个小问题 1.为啥使用 Linux 搭建服务器? ...

  8. Windows(x86,64bit)升级MySQL 5.7.17免安装版的详细教程

    MySQL需要升级到5.5.3以上版本才支持Laravel 5.4默认的utf8mb64字符编码.因此就把MySQL升级了一下,期间还是遇到些小问题,记录一下以供参考. 升级准备 备份之前MySql目 ...

  9. .NET 5/.NET Core使用EF Core 5连接MySQL数据库写入/读取数据示例教程

    本文首发于<.NET 5/.NET Core使用EF Core 5(Entity Framework Core)连接MySQL数据库写入/读取数据示例教程> 前言 在.NET Core/. ...

随机推荐

  1. 十一.简单MariaDB数据库的管理

    默认端口:3306 1.安装 ]# yum -y install mariadb-server ]# systemctl restart mariadb 2.基本操作 ]# mysql #进入 ]&g ...

  2. 2019暑期金华集训 Day1 数据结构

    自闭集训 Day1 数据结构 CF643G 用类似于下面的方法,搬到线段树上. 如何合并两个集合?先全部放在一起,每次删掉最小的\(cnt_i\),然后把其他所有的\(cnt\)都减去\(cnt_i\ ...

  3. 5.Python3列表和元组

    5.1序列 在python3中序列结构主要有列表.元组.集合.字典和字符串,对于这些序列有以下通用操作. 5.1.1 索引 序列中的每一个元素都有 一个编号,也称为索引.这个索引是从0开始递增的,即下 ...

  4. 解决Ubuntu重启后,core_pattern失效问题——手动关闭apport

    云主机重启后,core_pattern,即/proc/sys/kernel/core_pattern和/etc/sysctl*配置失效,被系统自动修改. 配置后,重启后core_pattern被重写 ...

  5. vue中点击复制粘贴功能 clipboard 移动端

    页面是由 v-for 循环渲染出来,要给每一个结构里面的复制按钮加一个复制功能 npm install clipboard --save    安装,如果安装处问题,多安装几次,我自己也安装了好几次 ...

  6. 数据结构Java版之查找算法(三)

    关于查找算法,这里只进行两个算法的说明.包括 顺序查找 和 折半查找. 顺序查找: 顺序查找常用于未排序的数据中.查找速度较慢,只能应用于较小的数据量. public int sequentialSe ...

  7. Markdown 小记

    在学习Markdown之前,对稍有轻微强迫症的我来说,写博客和做笔记是一件很痛苦的事.废话不多说直接来看,偷偷吐槽:不知道咋在博客园配置Markdown,以后如果学会了回来补充. 标题 #hello一 ...

  8. CentOS7 修改设置静态IP和DNS

    最近因为学习Puppet,用虚拟机装了个CentOS,使用的NAT的网络模式,为了防止再次启动系统的时候网络IP发生变化,因此设置静态IP和DNS. 由于CentOS是最小化安装,没有ifconfig ...

  9. Eclipse自动生成作者、日期注释等功能设置 (转载)

    原文地址:http://blog.sina.com.cn/s/blog_4080505a0101guoh.html 在使用Eclipse 编写Java代码时,自动生成的注释信息都是按照预先设置好的格式 ...

  10. 设备树中指定的中断触发方式与request_irq中指定的触发方式不一致时,内核会使用哪种中断触发方式呢?

    答:会使用request_irq中指定的触发方式