當我們需要一份報表以橫式方現呈現時,可以用 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 |