Oracle統計某一年中的1-12個月的數據總和
阿新 • • 發佈:2017-06-22
頁面 數據 into padding ber index load from html
查詢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
|
Oracle統計某一年中的1-12個月的數據總和