Oracle 统计某一年中的1-12个月的数据总和(非常实用)

实战案例

查询2015年1月到12个月的所有实有人口数量和往年2014年1月到12个月的实有人口数量,没有的月份显示 人口数量为0.类似效果如图

创建表

create table PERSONSITUATION
(
  id    NUMBER not null,
  rdate DATE,
  nums  NUMBER
)

插入数据

insert into PERSONSITUATION (id, rdate, nums) values (1, to_date('26-01-2015', 'dd-mm-yyyy'), 131);
insert into PERSONSITUATION (id, rdate, nums) values (2, to_date('27-01-2013', 'dd-mm-yyyy'), 232);
insert into PERSONSITUATION (id, rdate, nums) values (3, to_date('18-10-2013', 'dd-mm-yyyy'), 222);
insert into PERSONSITUATION (id, rdate, nums) values (4, to_date('20-01-2015', 'dd-mm-yyyy'), 232);
insert into PERSONSITUATION (id, rdate, nums) values (5, to_date('28-01-2015', 'dd-mm-yyyy'), 422);
insert into PERSONSITUATION (id, rdate, nums) values (6, to_date('26-02-2015', 'dd-mm-yyyy'), 232);
insert into PERSONSITUATION (id, rdate, nums) values (7, to_date('29-01-2014', 'dd-mm-yyyy'), 225);
insert into PERSONSITUATION (id, rdate, nums) values (8, to_date('31-01-2015', 'dd-mm-yyyy'), 111);
insert into PERSONSITUATION (id, rdate, nums) values (9, to_date('25-01-2013', 'dd-mm-yyyy'), 211);
insert into PERSONSITUATION (id, rdate, nums) values (10, to_date('25-01-2013', 'dd-mm-yyyy'), 251);
insert into PERSONSITUATION (id, rdate, nums) values (11, to_date('25-01-2013', 'dd-mm-yyyy'), 262);
insert into PERSONSITUATION (id, rdate, nums) values (12, to_date('25-08-2015', 'dd-mm-yyyy'), 233);
insert into PERSONSITUATION (id, rdate, nums) values (13, to_date('25-01-2013', 'dd-mm-yyyy'), 211);
insert into PERSONSITUATION (id, rdate, nums) values (14, to_date('25-02-2014', 'dd-mm-yyyy'), 222);
insert into PERSONSITUATION (id, rdate, nums) values (15, to_date('25-03-2012', 'dd-mm-yyyy'), 209);
insert into PERSONSITUATION (id, rdate, nums) values (16, to_date('25-01-2012', 'dd-mm-yyyy'), 219);

常见的统计中如下Sql语句,只查询到了数据中有的月,如果没有就什么也没有显示,和明显不符合1-12个月的12条数据统计

select to_char(rdate,'yyyy-mm') rdate,sum(nums) nums from personsituation where to_char(rdate,'yyyy')='2015' group by to_char(rdate,'yyyy-mm') order by rdate

正确的分析是:必须是12条数据,而且是统计的结果的12条数据,从这里入手编写如下Sql语句,显示12个列的统计数据,先查询出一年的数据,然后再连接另外一条数据拼接

select sum(decode(to_char(rdate,'mm'),'01',nums,0)) nums01,sum(decode(to_char(rdate,'mm'),'02',nums,0)) nums02,
       sum(decode(to_char(rdate,'mm'),'03',nums,0)) nums03,sum(decode(to_char(rdate,'mm'),'04',nums,0)) nums04,
       sum(decode(to_char(rdate,'mm'),'05',nums,0)) nums05,sum(decode(to_char(rdate,'mm'),'06',nums,0)) nums06,
       sum(decode(to_char(rdate,'mm'),'07',nums,0)) nums07,sum(decode(to_char(rdate,'mm'),'08',nums,0)) nums08,
       sum(decode(to_char(rdate,'mm'),'09',nums,0)) nums09,sum(decode(to_char(rdate,'mm'),'10',nums,0)) nums10,
       sum(decode(to_char(rdate,'mm'),'11',nums,0)) nums11,sum(decode(to_char(rdate,'mm'),'12',nums,0)) nums12
           from personsituation
           where to_char(rdate,'yyyy')='2015' 

而前端页面显示的结果有两种可能性,一种是横向展示,一种是纵向展示,可以使用下面的sql语句进行列转行的转换得到如下结果

select * from (
  select sum(decode(to_char(rdate,'mm'),'01',nums,0)) nums01,sum(decode(to_char(rdate,'mm'),'02',nums,0)) nums02,
     sum(decode(to_char(rdate,'mm'),'03',nums,0)) nums03,sum(decode(to_char(rdate,'mm'),'04',nums,0)) nums04,
     sum(decode(to_char(rdate,'mm'),'05',nums,0)) nums05,sum(decode(to_char(rdate,'mm'),'06',nums,0)) nums06,
     sum(decode(to_char(rdate,'mm'),'07',nums,0)) nums07,sum(decode(to_char(rdate,'mm'),'08',nums,0)) nums08,
     sum(decode(to_char(rdate,'mm'),'09',nums,0)) nums09,sum(decode(to_char(rdate,'mm'),'10',nums,0)) nums10,
     sum(decode(to_char(rdate,'mm'),'11',nums,0)) nums11,sum(decode(to_char(rdate,'mm'),'12',nums,0)) nums12
         from personsituation
         where to_char(rdate,'yyyy')='2015'
)  unpivot (sum2015 for years in (nums01,nums02,nums03,nums04,nums05,nums06,nums07,nums08,nums09,nums10,nums11,nums12) )

最后一步就是和往年的数据对比使用left join查询

select A.years,A.SUM2015,B.SUM2014 from
  (select * from (
    select sum(decode(to_char(rdate,'mm'),'01',nums,0)) nums01,sum(decode(to_char(rdate,'mm'),'02',nums,0)) nums02,
       sum(decode(to_char(rdate,'mm'),'03',nums,0)) nums03,sum(decode(to_char(rdate,'mm'),'04',nums,0)) nums04,
       sum(decode(to_char(rdate,'mm'),'05',nums,0)) nums05,sum(decode(to_char(rdate,'mm'),'06',nums,0)) nums06,
       sum(decode(to_char(rdate,'mm'),'07',nums,0)) nums07,sum(decode(to_char(rdate,'mm'),'08',nums,0)) nums08,
       sum(decode(to_char(rdate,'mm'),'09',nums,0)) nums09,sum(decode(to_char(rdate,'mm'),'10',nums,0)) nums10,
       sum(decode(to_char(rdate,'mm'),'11',nums,0)) nums11,sum(decode(to_char(rdate,'mm'),'12',nums,0)) nums12
           from personsituation
           where to_char(rdate,'yyyy')='2015'
  ) unpivot (sum2015 for years in (nums01,nums02,nums03,nums04,nums05,nums06,nums07,nums08,nums09,nums10,nums11,nums12) )) A
left join
  (select * from (
    select sum(decode(to_char(rdate,'mm'),'01',nums,0)) nums01,sum(decode(to_char(rdate,'mm'),'02',nums,0)) nums02,
       sum(decode(to_char(rdate,'mm'),'03',nums,0)) nums03,sum(decode(to_char(rdate,'mm'),'04',nums,0)) nums04,
       sum(decode(to_char(rdate,'mm'),'05',nums,0)) nums05,sum(decode(to_char(rdate,'mm'),'06',nums,0)) nums06,
       sum(decode(to_char(rdate,'mm'),'07',nums,0)) nums07,sum(decode(to_char(rdate,'mm'),'08',nums,0)) nums08,
       sum(decode(to_char(rdate,'mm'),'09',nums,0)) nums09,sum(decode(to_char(rdate,'mm'),'10',nums,0)) nums10,
       sum(decode(to_char(rdate,'mm'),'11',nums,0)) nums11,sum(decode(to_char(rdate,'mm'),'12',nums,0)) nums12
           from personsituation
           where to_char(rdate,'yyyy')='2014'
  ) unpivot (sum2014 for years in (nums01,nums02,nums03,nums04,nums05,nums06,nums07,nums08,nums09,nums10,nums11,nums12) )) B
on A.years = B.years

实现与效果图一样的数据,可以将sql中的nums01...nums12改为1月...12月

行转列,列转行有不懂得地方可以参考文章:http://blog.csdn.net/xiaokui_wingfly/article/details/42419207  觉得不错记得点赞浏览,谢谢

时间: 2024-09-28 06:28:09

Oracle 统计某一年中的1-12个月的数据总和(非常实用)的相关文章

MySQL 统计过去12个月的数据(包括本月)

1.问题 需要统计过去12个月的数据,如现在是2015年4月,那么我们需要统计从2014年5月到2015年4月的数据情况.而这12个月中,如果这个月没有数据的,则统计为0. 原始数据表如下图,数据是按分钟存储的.也就是说要统计每个月一共有多少条body_infared大于0的数据. 2.处理过程 2.1 获取12个月到现在的数据 select * from device_data t where DATE_FORMAT(t.time,'%Y-%m')> DATE_FORMAT(date_sub(

Oracle统计某一年中的1-12个月的数据总和

查询2015年1月到12个月的所有实有人口数量和往年2014年1月到12个月的实有人口数量,没有的月份显示 人口数量为0.类似效果如图 创建表 ? 1 2 3 4 5 6 create table PERSONSITUATION (   id    NUMBER not null,   rdate DATE,   nums  NUMBER ) 插入数据 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 insert into PERSONSITUATION (id

Python得到前面12个月的数据,Python得到现在时间 前一年的数据,

#Python 实现得到现在时间12个月前的每个月 # 假设现在的时间是2016年9月25日 #得到现在的时间 得到now等于2016年9月25日 now = datetime.datetime.now() #得到今年的的时间 (年份) 得到的today_year等于2016年 today_year = now.year #今年的时间减去1,得到去年的时间.last_year等于2015 last_year = int(now.year) -1 #得到今年的每个月的时间.today_year_m

mysql 根据某一年 查询12个月的数据

1.时间字段是datetime类型 2.需要用到中间表,表结构和数据链接下载 https://pan.baidu.com/s/1sAQ78e3Ao-KwvYJlaipbKQ 3.前两个 adddate 月日需要在数据库写死 从每年的-01-01开始,-最后一个日期同理xxxx-12-31 4.下面是sql select concat(month(years.date),'月') as year, years.date, date_format(years.date, '%Y-%m') AS ye

统计过去一年数据,按12月展示,为0 的数据也展示

第一种方法 按每个月统计出一行数据,然后再行专列. select decode(counttime,'NUMS01',to_char(add_months(sysdate,0),'mm'),'NUMS02',to_char(add_months(sysdate,-1),'mm'),'NUMS03',to_char(add_months(sysdate,-2),'mm'),'NUMS04',to_char(add_months(sysdate,-3),'mm'),'NUMS05',to_char(

Oracle统计用户所有表的行数

DECLARE   CURSOR c1 is select table_name from user_tables;   V_TABLE_NAME user_tables.TABLE_NAME%TYPE;   V_CNT number;   V_SQL varchar2(2000); BEGIN   FOR V_TABLE_NAME in c1 loop      V_SQL := 'select count(1) from ' || V_TABLE_NAME.table_name;      

CenOS7 部署 数据库 Oracle 12c + 启动阶段与关闭状态 [12.2 企业版]

简介 1·Oracle 12c 特性2·Oracle 12c 服务器的硬件要求3·Oracle 12c 部署过程4·Oracle 12c 的启动方式与关闭状态5·Oracle 12c 的总结 Oracle 12c 特性 Oracle Database 12 c-是世界上第一个专为云设计的数据库. A·使用Oracle Multitenant插入云端 > 数据库整合是云之旅的关键一步.Oracle Database 12 c使流程更加快速和简单,实现了高密度的基于模式的整合 - 无需更改现有应用程

Oracle统计、分析和优化环境配置

Oracle统计.分析和优化环境配置 创建批处理文件Login.bat 用于初始化设置系统环境 Login.bat @echo off title eoda mode con cols=140 color 85 set ORACLE_SID=muphy sqlplus eoda/foo 创建数据库脚本文件login.sql 用于初始化SQL*PLUS运行环境 define _editor=vim  --设置编辑器为vim set serveroutput on size 1000000 --设置

Oracle笔记(四) 简单查询、限定查询、数据的排序

Oracle笔记(四) 简单查询.限定查询.数据的排序 一.简单查询 SQL(Structured Query Language) 结构化查询语言,是一种数据库查询和程序设计语言,用于存取数据以及查询.更新和管理关系数据库系统.ANSI(美国国家标准学会)声称,SQL是关系数据库管理系统的标准语言. Oracle数据库之所以发展的很好,主要也是因为Oracle是全世界最早采用SQL语句的数据库产品. SQL功能强大,概括起来,它可以分成以下几组: DML(Data Manipulation La