php+mysql做统计

9 篇文章 0 订阅

MySQL中Case When用法详解

   最近,在学习Hive基础知识时,遇到了遇到了Case When Else End语法,以前学习MySQL时忽略了这部分知识点,现总结一下相关的知识给大家。首先练习一个例子如下:

一、学生课程成绩统计

1)建表

 
  1. use hiveDemo;

  2. CREATE TABLE `course` (

  3. `id` int,

  4. `sid` int ,

  5. `course` string,

  6. `score` int

  7. ) ;

 2)插入数据

 
  1. // 字段解释:id, 学号, 课程, 成绩

  2. INSERT INTO `course` VALUES (1, 1, 'yuwen', 43);

  3. INSERT INTO `course` VALUES (2, 1, 'shuxue', 55);

  4. INSERT INTO `course` VALUES (3, 2, 'yuwen', 77);

  5. INSERT INTO `course` VALUES (4, 2, 'shuxue', 88);

  6. INSERT INTO `course` VALUES (5, 3, 'yuwen', 98);

  7. INSERT INTO `course` VALUES (6, 3, 'shuxue', 65);

3)需求

求:所有数学课程成绩 大于 语文课程成绩的学生的学号

 

最开始的想法是打算同过自连接的方式来解决,后来咨询了公司的同事,知道了可以case可以用来解决此问题。

a.使用case...when...将不同的课程名称转换成不同的列。 

 
  1. create view tmp_course_view as

  2. select sid, case course when "shuxue" then score else 0 end as shuxue,

  3. case course when "yuwen" then score else 0 end as yuwen from course;

  4.  
  5. select * from tmp_course_view;

  

b.以sid分组合并取各成绩最大值

 
  1. create view tmp_course_view1 as

  2. select aa.sid, max(aa.shuxue) as shuxue, max(aa.yuwen) as yuwen from tmp_course_view aa group by sid;

  3.  
  4. select * from tmp_course_view1;

  c.比较结果

select * from tmp_course_view1 where shuxue > yuwen;

二、Case When Else End用法详解

 1)更新

 
  1. update table

  2. set 字段1=case

  3. when 条件1 then 值1

  4. when 条件2 then 值2

  5. else 值3

  6. end

  7. where ……

2)查询

 
  1. select 字段1, 字段2,

  2. case 字段3

  3. when 值1 then 新值

  4. when 值2 then 新值

  5. end as 重新命名字段3的名字

  6. from table

  7. where ……

  8. order by ……

在一般的SELECT中,其语法如下:   

 
  1. sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁SELECT <myColumnSpec> =

  2. sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁CASE

  3. sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁WHEN <A> THEN <somethingA>

  4. sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁WHEN <B> THEN <somethingB>

  5. sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁ELSE <somethingE>

  6. sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁END

CASE可能是 SQL 中被误用最多的关键字之一。虽然你可能以前用过这个关键字来创建字段,但是它还具有更多用法。例如,你可以在 WHERE、GROUP BY和Order By子句中使用CASE。

 

 

一:php+mysql 生成统计报表

mysql获取数据的代码:

//结束时间 年月日
$endTime = date('Y-m-d');
//开始时间 年月日 前30天日期
$startTime = date('Y-m-d', (strtotime($endTime) - 30*24*60*60));
//循环的初始值 秒
$start = strtotime($startTime);
//循环的最大值 秒
$end = strtotime($endTime);
//步长 一天 循环的时候按一天的时间作为步长
$step = 24*60*60;

//sql语句 按点击代码 分组查询 按板块编号和点击的代码升序排序
$groupByHitCodeSql = "select type_id,hit_code,hit_name,";
for($i=$start; $i<$end; $i+=$step){
    $time = date('Y-m-d', $i);
    $groupByHitCodeSql .= " sum(case when DATE_FORMAT(`hit_date`,'%Y-%m-%d') = '{$time}' then `hit_num` else 0 end) as '$time',";
}

$groupByHitCodeSql = trim($groupByHitCodeSql, ',');
$groupByHitCodeSql .= " from tableName where `hit_date`>='{$startTime}' and `hit_date`<='{$endTime}' group by hit_code order by type_id asc,hit_code asc";

//运行程序生成代码
select type_id,hit_code,hit_name,
    sum(case when DATE_FORMAT(`hit_date`,'%Y-%m-%d') = '2012-11-11' then `hit_num` else 0 end) as '2012-11-11',
    sum(case when DATE_FORMAT(`hit_date`,'%Y-%m-%d') = '2012-11-12' then `hit_num` else 0 end) as '2012-11-12',
    sum(case when DATE_FORMAT(`hit_date`,'%Y-%m-%d') = '2012-11-13' then `hit_num` else 0 end) as '2012-11-13',
    sum(case when DATE_FORMAT(`hit_date`,'%Y-%m-%d') = '2012-11-14' then `hit_num` else 0 end) as '2012-11-14',
    sum(case when DATE_FORMAT(`hit_date`,'%Y-%m-%d') = '2012-11-15' then `hit_num` else 0 end) as '2012-11-15',
    sum(case when DATE_FORMAT(`hit_date`,'%Y-%m-%d') = '2012-11-16' then `hit_num` else 0 end) as '2012-11-16',
    sum(case when DATE_FORMAT(`hit_date`,'%Y-%m-%d') = '2012-11-17' then `hit_num` else 0 end) as '2012-11-17',
    sum(case when DATE_FORMAT(`hit_date`,'%Y-%m-%d') = '2012-11-18' then `hit_num` else 0 end) as '2012-11-18',
    sum(case when DATE_FORMAT(`hit_date`,'%Y-%m-%d') = '2012-11-19' then `hit_num` else 0 end) as '2012-11-19',
    sum(case when DATE_FORMAT(`hit_date`,'%Y-%m-%d') = '2012-11-20' then `hit_num` else 0 end) as '2012-11-20',
    sum(case when DATE_FORMAT(`hit_date`,'%Y-%m-%d') = '2012-11-21' then `hit_num` else 0 end) as '2012-11-21',
    sum(case when DATE_FORMAT(`hit_date`,'%Y-%m-%d') = '2012-11-22' then `hit_num` else 0 end) as '2012-11-22',
    sum(case when DATE_FORMAT(`hit_date`,'%Y-%m-%d') = '2012-11-23' then `hit_num` else 0 end) as '2012-11-23',
    sum(case when DATE_FORMAT(`hit_date`,'%Y-%m-%d') = '2012-11-24' then `hit_num` else 0 end) as '2012-11-24',
    sum(case when DATE_FORMAT(`hit_date`,'%Y-%m-%d') = '2012-11-25' then `hit_num` else 0 end) as '2012-11-25',
    sum(case when DATE_FORMAT(`hit_date`,'%Y-%m-%d') = '2012-11-26' then `hit_num` else 0 end) as '2012-11-26',
    sum(case when DATE_FORMAT(`hit_date`,'%Y-%m-%d') = '2012-11-27' then `hit_num` else 0 end) as '2012-11-27',
    sum(case when DATE_FORMAT(`hit_date`,'%Y-%m-%d') = '2012-11-28' then `hit_num` else 0 end) as '2012-11-28',
    sum(case when DATE_FORMAT(`hit_date`,'%Y-%m-%d') = '2012-11-29' then `hit_num` else 0 end) as '2012-11-29',
    sum(case when DATE_FORMAT(`hit_date`,'%Y-%m-%d') = '2012-11-30' then `hit_num` else 0 end) as '2012-11-30',
    sum(case when DATE_FORMAT(`hit_date`,'%Y-%m-%d') = '2012-12-01' then `hit_num` else 0 end) as '2012-12-01',
    sum(case when DATE_FORMAT(`hit_date`,'%Y-%m-%d') = '2012-12-02' then `hit_num` else 0 end) as '2012-12-02',
    sum(case when DATE_FORMAT(`hit_date`,'%Y-%m-%d') = '2012-12-03' then `hit_num` else 0 end) as '2012-12-03',
    sum(case when DATE_FORMAT(`hit_date`,'%Y-%m-%d') = '2012-12-04' then `hit_num` else 0 end) as '2012-12-04',
    sum(case when DATE_FORMAT(`hit_date`,'%Y-%m-%d') = '2012-12-05' then `hit_num` else 0 end) as '2012-12-05',
    sum(case when DATE_FORMAT(`hit_date`,'%Y-%m-%d') = '2012-12-06' then `hit_num` else 0 end) as '2012-12-06',
    sum(case when DATE_FORMAT(`hit_date`,'%Y-%m-%d') = '2012-12-07' then `hit_num` else 0 end) as '2012-12-07',
    sum(case when DATE_FORMAT(`hit_date`,'%Y-%m-%d') = '2012-12-08' then `hit_num` else 0 end) as '2012-12-08',
    sum(case when DATE_FORMAT(`hit_date`,'%Y-%m-%d') = '2012-12-09' then `hit_num` else 0 end) as '2012-12-09',
    sum(case when DATE_FORMAT(`hit_date`,'%Y-%m-%d') = '2012-12-10' then `hit_num` else 0 end) as '2012-12-10'
from juren_shouyes
where `hit_date`>='2012-11-11' and `hit_date`<='2012-12-11'
group by hit_code
order by type_id asc,hit_code asc

//数据库中运行 生成如下表格

 

二:mysql 按日、周、月、年统计sql语句整理,实现报表统计可视化

最近在做报表统计,前端可视化插件用的是Echarts,个人认为是目前免费插件里的翘楚http://echarts.baidu.com/demo.html#pie-doughnut例子演示

现在重点如何把后台数据源搞定,我采用的是mybatis,所以重点是怎么把sql语句写好。

– –按日

SELECT COUNT(*),DATE(CreateTime) FROM t_voipchannelrecord WHERE YEAR(CreateTime)='2016' GROUP BY DAY(CreateTime)
  • 1

这里写图片描述

– –按周

 SELECT COUNT(*),WEEK(CreateTime) FROM t_voipchannelrecord WHERE MONTH(CreateTime) = '8' GROUP BY WEEK(CreateTime) 
  • 1

–周一到周五每天的统计结果

 SELECT COUNT(*),DAYNAME(CreateTime) FROM t_voipchannelrecord WHERE YEAR(CreateTime) = '2016' GROUP BY DAYNAME(CreateTime) 
  • 1

这里写图片描述

–统计本周数据

SELECT COUNT(*) FROM t_voipchannelrecord WHERE MONTH(CreateTime) =
MONTH(CURDATE()) AND WEEK(CreateTime) = WEEK(CURDATE())
  • 1
  • 2

–按月统计

SELECT COUNT(*),MONTH(CreateTime) FROM t_voipchannelrecord WHERE YEAR(CreateTime) = '2016' GROUP BY MONTH(CreateTime) 
  • 1

这里写图片描述

–统计本月数据

SELECT COUNT(*) FROM t_voipchannelrecord WHERE MONTH(CreateTime) =
MONTH(CURDATE()) AND YEAR(CreateTime) = YEAR(CURDATE())
  • 1
  • 2

–按季统计

SELECT COUNT(*),QUARTER(CreateTime) FROM t_voipchannelrecord WHERE YEAR(CreateTime) = '2016' GROUP BY QUARTER(CreateTime) 
  • 1

–按年统计


SELECT COUNT(*),YEAR(CreateTime) FROM t_voipchannelrecord  GROUP BY YEAR(CreateTime) 
  • 1
  • 2

–时间段(该段参考:出处)

N天内记录
WHERE TO_DAYS(NOW()) - TO_DAYS(时间字段) <= N
当天的记录
where date(时间字段)=date(now())
 或
where to_days(时间字段) = to_days(now());

 查询一周:
select * from table   where DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(column_time);

 查询一个月:
select * from table where DATE_SUB(CURDATE(), INTERVAL INTERVAL 1 MONTH) <= date(column_time);



查询'06-03'到'07-08'这个时间段内所有过生日的会员:
   Select * From user Where
DATE_FORMAT(birthday,'%m-%d') >= '06-03' and DATE_FORMAT(birthday,'%m-%d')
<= '07-08';

统计一季度数据,表时间字段为:savetime 
group by concat(date_format(savetime, '%Y '),FLOOR((date_format(savetime, '%m ')+2)/3))
 或
select YEAR(savetime)*10+((MONTH(savetime)-1) DIV 3) +1,count(*) 
from yourTable
group by YEAR(savetime)*10+((MONTH(savetime)-1) DIV 3) +1;

 

三:SQL统计实例——mysql实现

网上的经典例题,这里用mysql方言实现。

 

表格如下:

 

mysql建表语句: 

复制代码

/*Table structure for table `stuscore` */

DROP TABLE IF EXISTS `stuscore`;

CREATE TABLE `stuscore` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  `subject` varchar(20) DEFAULT NULL,
  `score` varchar(20) DEFAULT NULL,
  `stuid` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;

/*Data for the table `stuscore` */

insert  into `stuscore`(`id`,`name`,`subject`,`score`,`stuid`) values 
(1,'张三','数学','89','1'),
(2,'张三','语文','80','1'),
(3,'张三','英语','70','1'),
(4,'李四','数学','90','2'),
(5,'李四','语文','70','2'),
(6,'李四','英语','80','2'),
(7,'王五','数学','55','3'),
(8,'王五','语文','92','3'),
(9,'王五','英语','74','3'),
(10,'赵六','数学','62','4'),
(11,'赵六','语文','81','4'),
(12,'赵六','英语','93','4');

复制代码

 

问题:

1.    计算每个人的总成绩并排名(要求显示字段:姓名,总成绩)

2.    计算每个人的总成绩并排名(要求显示字段: 学号,姓名,总成绩)

3.    计算每个人单科的最高成绩(要求显示字段: 学号,姓名,课程,最高成绩)

4.    计算每个人的平均成绩(要求显示字段: 学号,姓名,平均成绩)

5.    列出各门课程成绩最好的学生(要求显示字段: 学号,姓名,科目,成绩)

6.    列出各门课程成绩最好的两位学生(要求显示字段: 学号,姓名,科目,成绩)

7.    统计如下:

学号

姓名

语文

数学

英语

总分

平均分

 

 

 

 

 

 

 

 

 

 

 

8.列出各门课程的平均成绩(要求显示字段:课程,平均成绩)

9.列出数学成绩的排名(要求显示字段:学号,姓名,成绩,排名)

10.列出数学成绩在2-3名的学生(要求显示字段:学号,姓名,科目,成绩)

11.求出李四的数学成绩的排名

12.统计如下:

课程

不及格(0-59)个

良(60-80)个

优(81-100)个

 

 

 

 

  

 

 

 

 

 答案:

1.    计算每个人的总成绩并排名(要求显示字段:姓名,总成绩)

SELECT a.name, SUM(score) sum_score FROM stuscore a GROUP BY a.name

  

2.    计算每个人的总成绩并排名(要求显示字段: 学号,姓名,总成绩)

SELECT a.stuid, a.name, SUM(score) sum_score FROM stuscore a GROUP BY a.name

  

3.    计算每个人单科的最高成绩(要求显示字段: 学号,姓名,课程,最高成绩)

SELECT a.stuid, a.name, a.subject, a.score FROM stuscore a
JOIN (
    SELECT stuid, MAX(score) max_score FROM stuscore GROUP BY stuid
)b ON a.stuid=b.stuid
WHERE a.score=b.max_score

  

4.    计算每个人的平均成绩(要求显示字段: 学号,姓名,平均成绩)

SELECT DISTINCT a.stuid, a.name, b.avg_score FROM stuscore a
JOIN (
    SELECT stuid, AVG(score) avg_score FROM stuscore GROUP BY stuid
)b ON a.stuid=b.stuid

  

5.    列出各门课程成绩最好的学生(要求显示字段: 学号,姓名,科目,成绩)

SELECT DISTINCT a.stuid, a.name, a.subject, a.score FROM stuscore a
JOIN (
    SELECT subject, MAX(score) max_score FROM stuscore GROUP BY subject
)b ON a.subject=b.subject
WHERE a.score=b.max_score

  

6.    列出各门课程成绩最好的两位学生(要求显示字段: 学号,姓名,科目,成绩)

SELECT DISTINCT a.stuid, a.name, a.subject, a.score FROM stuscore a
WHERE (
    SELECT COUNT(1) FROM stuscore b
    WHERE b.subject=a.subject AND b.score>=a.score
) <= 2
ORDER BY a.subject ASC, a.score DESC

  

7.    统计如下:

学号

姓名

语文

数学

英语

总分

平均分

 

 

 

 

 

 

 

 

 

 

 

SELECT a.stuid 学号, a.name 姓名,
    SUM(CASE WHEN a.subject='语文' THEN score ELSE 0 END)语文,
    SUM(CASE WHEN a.subject='数学' THEN score ELSE 0 END)数学,
    SUM(CASE WHEN a.subject='英语' THEN score ELSE 0 END)英语,
    SUM(score)总分, (SUM(score)/COUNT(1))平均分
FROM stuscore a GROUP BY a.stuid

  

8.列出各门课程的平均成绩(要求显示字段:课程,平均成绩)

SELECT a.subject, AVG(score) avg_score FROM stuscore a GROUP BY a.subject

  

9.列出数学成绩的排名(要求显示字段:学号,姓名,成绩,排名)

SELECT a.*, @var:=@var+1 rank
FROM (
    SELECT stuid, name, score FROM stuscore
    WHERE subject='数学' ORDER BY score DESC
)a, (SELECT @var:=0)b

  

10.列出数学成绩在2-3名的学生(要求显示字段:学号,姓名,科目,成绩)

复制代码

SELECT t.* FROM (
    SELECT a.*, @var:=@var+1 rank
    FROM (
        SELECT stuid, NAME, score FROM stuscore
        WHERE SUBJECT='数学' ORDER BY score DESC
    )a, (SELECT @var:=0)b
)t WHERE t.rank IN (2,3)

复制代码

  

11.求出李四的数学成绩的排名

复制代码

SELECT t.* FROM (
    SELECT a.*, @var:=@var+1 rank
    FROM (
        SELECT stuid, name, score FROM stuscore
        WHERE subject='数学' ORDER BY score DESC
    )a, (SELECT @var:=0)b
)t WHERE t.name='李四'

复制代码

  

12.统计如下:

课程

不及格(0-59)个

良(60-80)个

优(81-100)个

 

 

 

 

  

 

 

 

SELECT a.subject 课程,
    (SELECT COUNT(1) FROM stuscore WHERE subject=a.subject AND score<60)不及格,
    (SELECT COUNT(1) FROM stuscore WHERE subject=a.subject AND score BETWEEN 60 AND 80)良,
    (SELECT COUNT(1) FROM stuscore WHERE subject=a.subject AND score>80)优
FROM stuscore a GROUP BY a.subject

 

 

四:Mysql实现统计查询

统计查询表中某一个字段每种类型的数量。
例:表内数据如下
在这里插入图片描述
现想要统计age 25岁前后的数量与百分比:
在这里插入图片描述

 

 

五:Mysql统计每年每个月的数据(前端页面统计图实现)

    

  

    最终想实现的效果图,在这里就不多废话了,直接上效果图,由于测试数据有几个月是为0的,所以数据图看着会有点怪怪。

    另外,个人使用了ssm框架(Spring、Mybatis、SpringMVC),可根据自己的项目情况修改

 

 

  接下来是数据库的两个表,这里直接给你们代码了,你们根据自己的需求更改即可

 

复制代码

 1 -- 会员充值表
 2 CREATE TABLE rechargeinfo(
 3     r_num INT PRIMARY KEY COMMENT '充值编号',
 4     v_card VARCHAR(12) COMMENT '会员卡号',
 5     r_recharge DOUBLE COMMENT '充值金额',
 6     r_payway VARCHAR(20) COMMENT '支付方式',
 7     o_id INT COMMENT '操作员工编号',
 8     r_time DATETIME COMMENT '交易时间',
 9     r_remark VARCHAR(50) COMMENT '交易备注',
10     FOREIGN KEY (o_id) REFERENCES operatorinfo(o_id)
11 )ENGINE = InnoDB COMMENT '会员充值信息表';
12 alter table rechargeinfo change r_time r_time timestamp not null default NOW();
13 
14 --停车登记表
15 
16 CREATE TABLE parkinginfo(
17     p_num INT PRIMARY KEY COMMENT '停车编号',
18     c_carplate VARCHAR(20) NOT NULL COMMENT '车牌号',
19     p_card VARCHAR(20) COMMENT '停车牌号',
20     p_picture VARCHAR(50) COMMENT '进场拍摄图',
21     p_entrytime Date COMMENT '进场时间',
22     p_leavetime Date COMMENT '出场时间',
23     p_type VARCHAR(10) COMMENT '客户类型',
24     p_cost Double COMMENT '停车费用',
25     p_payway VARCHAR(20) COMMENT '支付方式',
26     v_card VARCHAR(12) COMMENT '会员卡号',
27     v_phone VARCHAR(12) COMMENT '临时客户手机号码',
28     p_condition VARCHAR(20) DEFAULT '正在停车中' COMMENT '状态',
29     p_remark VARCHAR(50) COMMENT '备注'
30 
31 )ENGINE = InnoDB COMMENT '停车信息表';
32 alter table parkinginfo change p_entrytime p_entrytime timestamp not null default NOW();

复制代码

 

 

  接下来就是重点了:

    SQL语句,只需要传入一个参数(年份)即可, 这个是统计会员充值表的,另一张表同理

 

复制代码

 1 select
 2     sum(case month(r_time) when '1'  then r_recharge else 0 end) as Jan,
 3     sum(case month(r_time) when '2'  then r_recharge else 0 end) as Feb,
 4     sum(case month(r_time) when '3'  then r_recharge else 0 end) as Mar,
 5     sum(case month(r_time) when '4'  then r_recharge else 0 end) as Apr,
 6     sum(case month(r_time) when '5'  then r_recharge else 0 end) as May,
 7     sum(case month(r_time) when '6'  then r_recharge else 0 end) as June,
 8     sum(case month(r_time) when '7'  then r_recharge else 0 end) as July,
 9     sum(case month(r_time) when '8'  then r_recharge else 0 end) as Aug,
10     sum(case month(r_time) when '9'  then r_recharge else 0 end) as Sept,
11     sum(case month(r_time) when '10' then r_recharge  else 0 end) as Oct,
12     sum(case month(r_time) when '11' then r_recharge  else 0 end) as Nov,
13     sum(case month(r_time) when '12' then r_recharge  else 0 end) as Dece
14 from rechargeinfo
15 where year(r_time)='2019';

复制代码

 

 

   效果图:可以看到,每个月的数据已经查出来了

 

   

   接下来给出的是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层:

 

复制代码

 1 //统计页面
 2     @RequestMapping("/totalui")
 3     public ModelAndView test(@RequestParam(value ="toyear",required = false,defaultValue = "2019")String toyear){
 4         ModelAndView mv = new ModelAndView();
 5 //        get all data
 6         Map<String, Double> rechargeTotal = service.getRechargeTotal(toyear);
 7         Map<String,Double> pachargeTotal = service.getParkingTotal(toyear);
 8 //        test
 9         System.out.println("测试所有数据: "+rechargeTotal.values()+"  ");
10         System.out.println("测试所有数据 : "+ pachargeTotal.values()+" ");
11 
12 //        统计
13         Map<String,Double> datatotal = new LinkedHashMap<>();
14         for(String key:rechargeTotal.keySet()){
15         if(pachargeTotal.containsKey(key)){
16         datatotal.put(key, rechargeTotal.get(key)+pachargeTotal.get(key));
17         }
18        }
19         System.out.println("合并后的数据!!!"+datatotal.values());
20 
21 //        set atrr
22         mv.addObject("redata",rechargeTotal.values());
23         mv.addObject("padata",pachargeTotal.values());
24         mv.addObject("totaldata",datatotal.values());
25         mv.setViewName("Income");
26         return mv;
27 
28     }

复制代码

 

    前端页面显示图代码:

 

复制代码

 1 <script>
 2     var chart = Highcharts.chart('container', {
 3         chart: {
 4             type: 'column'
 5         },
 6         title: {
 7             text: '洱海湾停车场营业额统计'
 8         },
 9 
10         legend: {
11             align: 'right',
12             verticalAlign: 'middle',
13             layout: 'vertical'
14         },
15         xAxis: {
16             categories: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'],
17             labels: {
18                 x: -10
19             }
20         },
21         yAxis: {
22             allowDecimals: false,
23             title: {
24                 text: '金额'
25             }
26         },
27         series: [{
28             name: '会员充值收入',
29             data: ${redata}
30         }, {
31             name: '停车收入',
32             data: ${padata}
33         }, {
34             name: '合计收入',
35             data: ${totaldata}
36         }],
37         responsive: {
38             rules: [{
39                 condition: {
40                     maxWidth: 1500
41                 },
42                 chartOptions: {
43                     legend: {
44                         align: 'center',
45                         verticalAlign: 'bottom',
46                         layout: 'horizontal'
47                     },
48                     yAxis: {
49                         labels: {
50                             align: 'left',
51                             x: 0,
52                             y: -5
53                         },
54                         title: {
55                             text: '¥金额以元为单位'
56                         }
57                     },
58                     subtitle: {
59                         text: null
60                     },
61                     credits: {
62                         enabled: false
63                     }
64                 }
65             }]
66         }
67     });
68 
69 </script>

复制代码

      

  大功告成,不懂得可以直接评论咨询!!!!!

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值