Oracle PL/SQL 不同筆資料, 在同一列顯示 (如: 前期數字, 本期數字比較)


在 Oracle PL/SQL 中,

要實現不同筆資料, 在同一列顯示這需求,

最常見的就是前後期數字比較,

除了 SYS_CONNECT_BY_PATH 之外,

還可以利用 UNION ALLGroup By 來完成, 如下 :

 範例程式碼
-- 建立暫存 Table
create table tomkuo1(
  code     varchar2(10)  -- 代碼
, name     varchar2(30)  -- 名稱
, tra_date varchar2(6)   -- 交易年月
, amount   number        -- 交易金額
);

-- 建立暫存 Data
insert into tomkuo1 values( 'a', 'aaa', '201011', 10000 );  -- 前期
insert into tomkuo1 values( 'a', 'aaa', '201011', 15000 );
insert into tomkuo1 values( 'a', 'aaa', '201012', 16000 );  -- 本期
insert into tomkuo1 values( 'a', 'aaa', '201012', 20000 );

insert into tomkuo1 values( 'b', 'bbb', '201011', 20000 );  -- 前期
insert into tomkuo1 values( 'b', 'bbb', '201011', 23000 );
insert into tomkuo1 values( 'b', 'bbb', '201012', 45000 );  -- 本期

insert into tomkuo1 values( 'c', 'ccc', '201011', 50000 );  -- 前期
insert into tomkuo1 values( 'c', 'ccc', '201012', 28000 );  -- 本期
insert into tomkuo1 values( 'c', 'ccc', '201012', 32000 );

insert into tomkuo1 values( 'd', 'ddd', '201011', 40000 );  -- 前期
insert into tomkuo1 values( 'd', 'ddd', '201012', 50000 );  -- 本期
commit;

-- 同時取得本期(201012) 與前期(201011) 的資料
select a.code
     , a.name
     , sum(a.amount1) 本期金額
     , sum(a.amount2) 前期金額
  from (-- 本期
        select code
             , name
             , sum(amount) amount1
             , 0           amount2
          from tomkuo1
         where tra_date = '201012'
         group by code, name
        union all
        -- 前期
        select code
             , name
             , 0           amount1
             , sum(amount) amount2
          from tomkuo1
         where tra_date = '201011'
         group by code, name
       ) a
 group by a.code, a.name
 order by a.code, a.name;

-- 結果顯示
CODE NAME 本期金額  前期金額
---- ---- ------- --------
a    aaa  36000   25000
b    bbb  45000   43000
c    ccc  60000   50000
d    ddd  50000   40000

參考看看囉 ^^.
Related Posts Plugin for WordPress, Blogger...