Mysql統計每年每個月的數據——詳細教程


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>

      

  大功告成,不懂得可以直接評論咨詢!!!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM