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, 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条数据统计
1
|
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个列的统计数据,先查询出一年的数据,然后再连接另外一条数据拼接
1
2
3
4
5
6
7
8
|
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语句进行列转行的转换得到如下结果
1
2
3
4
5
6
7
8
9
10
|
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查询
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
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月
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
select A.years,A.SUM1,B.SUM2 from
( select * from (
select sum (decode(to_char(rdate, 'mm' ), '01' ,nums,0)) 一月, sum (decode(to_char(rdate, 'mm' ), '02' ,nums,0)) 二月,
sum (decode(to_char(rdate, 'mm' ), '03' ,nums,0)) 三月, sum (decode(to_char(rdate, 'mm' ), '04' ,nums,0)) 四月,
sum (decode(to_char(rdate, 'mm' ), '05' ,nums,0)) 五月, sum (decode(to_char(rdate, 'mm' ), '06' ,nums,0)) 六月,
sum (decode(to_char(rdate, 'mm' ), '07' ,nums,0)) 七月, sum (decode(to_char(rdate, 'mm' ), '08' ,nums,0)) 八月,
sum (decode(to_char(rdate, 'mm' ), '09' ,nums,0)) 九月, sum (decode(to_char(rdate, 'mm' ), '10' ,nums,0)) 十月,
sum (decode(to_char(rdate, 'mm' ), '11' ,nums,0)) 十一月, sum (decode(to_char(rdate, 'mm' ), '12' ,nums,0)) 十二月
from personsituation
where to_char(rdate, 'yyyy' )= '2015'
) unpivot (sum1 for years in (一月,二月,三月,四月,五月,六月,七月,八月, 九月,十月,十一月,十二月) )) A
left join
( select * from (
select sum (decode(to_char(rdate, 'mm' ), '01' ,nums,0)) 一月, sum (decode(to_char(rdate, 'mm' ), '02' ,nums,0)) 二月,
sum (decode(to_char(rdate, 'mm' ), '03' ,nums,0)) 三月, sum (decode(to_char(rdate, 'mm' ), '04' ,nums,0)) 四月,
sum (decode(to_char(rdate, 'mm' ), '05' ,nums,0)) 五月, sum (decode(to_char(rdate, 'mm' ), '06' ,nums,0)) 六月,
sum (decode(to_char(rdate, 'mm' ), '07' ,nums,0)) 七月, sum (decode(to_char(rdate, 'mm' ), '08' ,nums,0)) 八月,
sum (decode(to_char(rdate, 'mm' ), '09' ,nums,0)) 九月, sum (decode(to_char(rdate, 'mm' ), '10' ,nums,0)) 十月,
sum (decode(to_char(rdate, 'mm' ), '11' ,nums,0)) 十一月, sum (decode(to_char(rdate, 'mm' ), '12' ,nums,0)) 十二月
from personsituation
where to_char(rdate, 'yyyy' )= '2014'
) unpivot (sum2 for years in (一月,二月,三月,四月,五月,六月,七月,八月, 九月,十月,十一月,十二月) )) B
on A.years = B.years
|
转载于:https://www.cnblogs.com/zhaobing0121/p/7066945.html
Oracle统计某一年中的1-12个月的数据总和相关推荐
- mysql查询前12个月的数据_MySQL 统计过去12个月的数据(包括本月),mysql本月
MySQL 统计过去12个月的数据(包括本月),mysql本月 1.问题 需要统计过去12个月的数据,如现在是2015年4月,那么我们需要统计从2014年5月到2015年4月的数据情况.而这12个月中 ...
- mysql统计一年12个月的数据,当某个月没数据的时候自动补0
在mysql中如何去统计12个月的数据,并且给没有数据的月份设置为0 ? 因为每个人的业务都不太一样,所以如何统计数据这个就不说了,不过我相信能看到这篇文章的人应该都已经做好数据统计,只是统计的数据并 ...
- MySQL 统计过去12个月的数据(包括本月)
1.问题 需要统计过去12个月的数据,如现在是2015年4月,那么我们需要统计从2014年5月到2015年4月的数据情况.而这12个月中,如果这个月没有数据的,则统计为0. 原始数据表如下图,数据是按 ...
- MySQL查询统计今年12个月的数据,没有默认为空
此处先省略二百字的废话 做报表统计的时候,常常需要在MySQL端用sql统计近12个月的数据,或者近30天的数据. 假如遇到当月没有数据,或者当天没有数据时,默认为0. SELECTCASE WHEN ...
- JAVA查询近12个月的数据并进行统计
业务场景 数据库中查询某一段近12个月的数据,但是有的月份无数据,或者有的月份有.如:A在2月份有数据,B在2月份没有.此时如果不从SQL层面查询出来的话则靠业务层写了.或者AB在两月都有.结果如下图 ...
- Mysql:获取距今最近12个月的数据
获取最近12个月的数据 并将没有数据的月份置为0 SELECT IFNULL(b.value,0) AS VALUE,a.name /*将value初始化为0 并将其作为value列下的数据*/FRO ...
- oracle 统计一年中每个月数据总和_Oracle 统计某一年中的1-12个月的数据总和
实战案例 查询2015年1月到12个月的所有实有人口数量和往年2014年1月到12个月的实有人口数量,没有的月份显示 人口数量为0.类似效果如图 创建表create table PERSONSITUA ...
- oracle 统计一年中每个月数据总和_Oracle 统计某一年中的1-12个月的数据总和(非常实用)...
实战案例 查询2015年1月到12个月的所有实有人口数量和往年2014年1月到12个月的实有人口数量,没有的月份显示 人口数量为0.类似效果如图 创建表 create table PERSONSITU ...
- MYSQL查询一年中12个月的数据,补全12个月.
1.建立12个月的视图 CREATE VIEW 12_month_view AS SELECT 01 AS month UNION SELECT 02 AS month UNION SELECT 03 ...
最新文章
- vim下自动排版命令
- 活动报名 | PaddlePaddle Hackathon飞桨黑客马拉松邀你参加
- JAVA面试题(part4)--控制跳转语句
- 【ios】如何成为一名ios开发
- mysql怎么绿化绿化_Windows下MySQL的绿化与精简
- 用ISAPI Filter设置HttpOnly属性
- 090717 T OOD时的接口
- python通过selenium模块模拟自动登录(以QQ空间为例)
- ei加声调怎么加_微商怎么加好友找客源实操篇
- 一阶广义差分模型_实验五 自相关性 -
- Ubuntu 部分截图
- Win2008建立kms服务器vlmcsd
- android高德地图清除marker,删除多个点标记-点标记-示例中心-JS API 示例 | 高德地图API...
- 有容云:梁胜-如何让Docker容器在企业中投产(上)
- threejs中几种挖洞方式
- 陆游和唐婉,潇潇和沐月
- MLK | 非监督学习最强攻略
- 【若依(ruoyi)】点击图标查看图片
- 显卡ai性能测试软件,超频性能测试:TDP限制严重
- 【每天更新】2022年最新WordPress主题下载,外贸独立站商城/企业网站/个人博客模板 2022-5-15
热门文章
- 《人工智能:计算Agent基础》——1.5 复杂性维度
- 转 JMeter之修改Sampler响应数据的编码格式
- JavaScript 函数replace揭秘
- GroovyHelp方便查看java api
- Tomcat与Apache集成
- 白话算法(1) for循环不是随便写的
- 蓝桥杯 ALGO-150 算法训练 6-1 递归求二项式系数值 java版
- python语言单词接龙_[蓝桥杯][算法训练VIP]单词接龙 (C语言代码)
- python 方差_python统计分析总体方差检验
- Javascript设计模式(五)代理模式