當我們需要一份報表以橫式方現呈現時,可以用 SYS_CONNECT_BY_PATH 函式達成:

-- 建立測試資料表
create table test_regist
(input_time date,
 regist number(10)
) pctfree 10 pctused 75;

-- 寫入測試數據
declare
v_now date default to_date('2009-01-01','yyyy-mm-dd');
v_input_time date;
v_regist number(10);
begin
    v_input_time:=v_now;
    for i in 1 ..30 loop
        v_input_time:=v_input_time+12;
        v_regist:=trunc(dbms_random.value(1,999));       
        insert into test_regist(input_time,regist)
        values(v_input_time,v_regist);
    end loop;
commit;
end;
/

-- 列出測試資料:
select * from test_regist;

INPUT_TIME REGIST
2009/1/13 550
2009/1/25 580
2009/2/6 234
2009/2/18 739
2009/3/2 767
2009/3/14 125
2009/3/26 722
2009/4/7 368
2009/4/19 295
2009/5/1 166
2009/5/13 7
2009/5/25 286
2009/6/6 333
2009/6/18 991
2009/6/30 697
2009/7/12 785
2009/7/24 202
2009/8/5 98
2009/8/17 274
2009/8/29 805
2009/9/10 822
2009/9/22 726
2009/10/4 316
2009/10/16 175
2009/10/28 399
2009/11/9 705
2009/11/21 938
2009/12/3 364
2009/12/15 219
2009/12/27 622


-- 直式顯示年度註冊統計
select to_char(trunc(input_time,'mm'),'yyyy-mm') as month,sum(regist) as total_regist
from test_regist
group by to_char(trunc(input_time,'mm'),'yyyy-mm');

MONTH TOTAL_REGIST
2009-01 1130
2009-02 973
2009-03 1614
2009-04 663
2009-05 459
2009-06 2021
2009-07 987
2009-08 1177
2009-09 1548
2009-10 890
2009-11 1643
2009-12 1205


-- 橫式顯示年度註冊統計
select max(ltrim(SYS_CONNECT_BY_PATH(num||'>'||total_regist,'  '),'  ')) as total_regist
from
(
select rownum as num,month,total_regist
from
(
select to_char(trunc(input_time,'mm'),'yyyy-mm') as month,sum(regist) as total_regist
from test_regist
group by to_char(trunc(input_time,'mm'),'yyyy-mm')

)
)
start with num = 1 connect by prior num+1 = num;


TOTAL_REGIST
1>1130  2>973  3>1614  4>663  5>459  6>2021  7>987  8>1177  9>1548  10>890  11>1643 
12>1205

<補充>
以 Decode方式也可達成橫式統計:

select nvl(sum(decode(to_char(input_time,'yyyy-mm'),'2009-01',regist,0)),0) as "2009-01",
       nvl(sum(decode(to_char(input_time,'yyyy-mm'),'2009-02',regist,0)),0) as "2009-02",
       nvl(sum(decode(to_char(input_time,'yyyy-mm'),'2009-03',regist,0)),0) as "2009-03",
       nvl(sum(decode(to_char(input_time,'yyyy-mm'),'2009-04',regist,0)),0) as "2009-04",
       nvl(sum(decode(to_char(input_time,'yyyy-mm'),'2009-05',regist,0)),0) as "2009-05",
       nvl(sum(decode(to_char(input_time,'yyyy-mm'),'2009-06',regist,0)),0) as "2009-06",
       nvl(sum(decode(to_char(input_time,'yyyy-mm'),'2009-07',regist,0)),0) as "2009-07",
       nvl(sum(decode(to_char(input_time,'yyyy-mm'),'2009-08',regist,0)),0) as "2009-08",
       nvl(sum(decode(to_char(input_time,'yyyy-mm'),'2009-09',regist,0)),0) as "2009-09",
       nvl(sum(decode(to_char(input_time,'yyyy-mm'),'2009-10',regist,0)),0) as "2009-10",
       nvl(sum(decode(to_char(input_time,'yyyy-mm'),'2009-11',regist,0)),0) as "2009-11",
       nvl(sum(decode(to_char(input_time,'yyyy-mm'),'2009-12',regist,0)),0) as "2009-12"
from test_regist;

2009-01 2009-02 2009-03 2009-04 2009-05 2009-06 2009-07 2009-08 2009-09 2009-10 2009-11 2009-12
1130 973 1614 663 459 2021 987 1177 1548 890 1643 1205

arrow
arrow
    全站熱搜

    DanBrother 發表在 痞客邦 留言(0) 人氣()