Oracle pivot 與unpivot的用法

這個例子是在live sql上看到的.具體網址:https://livesql.oracle.com/apex/f?p=590:49sql

好像要註冊一個Oracle帳號oracle

create table olympic_medal_winners (   
  olympic_year int,  
  sport        varchar2( 30 ),  
  gender       varchar2( 1 ),  
  event        varchar2( 128 ),  
  medal        varchar2( 10 ),  
  noc          varchar2( 3 ),  
  athlete      varchar2( 128 ) 
);


Insert into olympic_medal_winners (OLYMPIC_YEAR,SPORT,GENDER,EVENT,MEDAL,NOC,ATHLETE) values (2016,'Archery','M','Men''s Individual','Gold','KOR','KU Bonchan');

Insert into olympic_medal_winners (OLYMPIC_YEAR,SPORT,GENDER,EVENT,MEDAL,NOC,ATHLETE) values (2016,'Archery','M','Men''s Individual','Silver','FRA','VALLADONT Jean-Charles');

Insert into olympic_medal_winners (OLYMPIC_YEAR,SPORT,GENDER,EVENT,MEDAL,NOC,ATHLETE) values (2016,'Archery','M','Men''s Individual','Bronze','USA','ELLISON Brady');

Insert into olympic_medal_winners (OLYMPIC_YEAR,SPORT,GENDER,EVENT,MEDAL,NOC,ATHLETE) values (2016,'Archery','M','Men''s Team','Gold','KOR','Republic of Korea');

Insert into olympic_medal_winners (OLYMPIC_YEAR,SPORT,GENDER,EVENT,MEDAL,NOC,ATHLETE) values (2016,'Archery','M','Men''s Team','Bronze','AUS','Australia');

Insert into olympic_medal_winners (OLYMPIC_YEAR,SPORT,GENDER,EVENT,MEDAL,NOC,ATHLETE) values (2016,'Archery','M','Men''s Team','Silver','USA','United States');

Insert into olympic_medal_winners (OLYMPIC_YEAR,SPORT,GENDER,EVENT,MEDAL,NOC,ATHLETE) values (2016,'Artistic Gymnastics','M','Men''s Floor Exercise','Gold','GBR','WHITLOCK Max');

Insert into olympic_medal_winners (OLYMPIC_YEAR,SPORT,GENDER,EVENT,MEDAL,NOC,ATHLETE) values (2016,'Artistic Gymnastics','M','Men''s Floor Exercise','Bronze','BRA','MARIANO Arthur');

Insert into olympic_medal_winners (OLYMPIC_YEAR,SPORT,GENDER,EVENT,MEDAL,NOC,ATHLETE) values (2016,'Artistic Gymnastics','M','Men''s Floor Exercise','Silver','BRA','HYPOLITO Diego');






SQL> select * from olympic_medal_winners;
OLYMPIC_YE SPORT                          GENDER EVENT                MEDAL      NOC ATHLETE
---------- ------------------------------ ------ -------------------- ---------- --- ------------------------------
      2016 Archery                        M      Men's Individual     Gold       KOR KU Bonchan
      2016 Archery                        M      Men's Individual     Silver     FRA VALLADONT Jean-Charles
      2016 Archery                        M      Men's Individual     Bronze     USA ELLISON Brady
      2016 Archery                        M      Men's Team           Gold       KOR Republic of Korea
      2016 Archery                        M      Men's Team           Bronze     AUS Australia
      2016 Archery                        M      Men's Team           Silver     USA United States
      2016 Artistic Gymnastics            M      Men's Floor Exercise Gold       GBR WHITLOCK Max
      2016 Artistic Gymnastics            M      Men's Floor Exercise Bronze     BRA MARIANO Arthur
      2016 Artistic Gymnastics            M      Men's Floor Exercise Silver     BRA HYPOLITO Diego
 
'
#####################################################################################################################################################################################        
#計算獎牌數
select * from olympic_medal_winners   
pivot ( count(*) for medal in (   
 'Gold' gold, 'Silver' silver, 'Bronze' bronze   
))   
order by noc;


OLYMPIC_YE SPORT                          GENDER EVENT                NOC ATHLETE                              GOLD     SILVER     BRONZE
---------- ------------------------------ ------ -------------------- --- ------------------------------ ---------- ---------- ----------
      2016 Archery                        M      Men's Team           AUS Australia                               0          0          1
      2016 Artistic Gymnastics            M      Men's Floor Exercise BRA HYPOLITO Diego                          0          1          0
      2016 Artistic Gymnastics            M      Men's Floor Exercise BRA MARIANO Arthur                          0          0          1
      2016 Archery                        M      Men's Individual     FRA VALLADONT Jean-Charles                  0          1          0
      2016 Artistic Gymnastics            M      Men's Floor Exercise GBR WHITLOCK Max                            1          0          0
      2016 Archery                        M      Men's Individual     KOR KU Bonchan                              1          0          0
      2016 Archery                        M      Men's Team           KOR Republic of Korea                       1          0          0
      2016 Archery                        M      Men's Individual     USA ELLISON Brady                           0          0          1
      2016 Archery                        M      Men's Team           USA United States                           0          1          0
         
'

SQL> select * from (
  2    select noc, medal, sport, event, gender, athlete
  3    from   olympic_medal_winners
  4  )
  5  pivot  (
  6    count( distinct sport ||'#'|| event ||'#'|| gender ) medals,
  7    count( distinct sport ) sports,
  8    listagg( athlete, ',') within group (order by athlete) athletes
  9    for medal in ( 'Gold' gold )
 10  )
 11  where  gold_medals > 1
 12  order  by gold_medals, gold_sports, noc;

NOC GOLD_MEDALS GOLD_SPORTS GOLD_ATHLETES
--- ----------- ----------- --------------------------------------------------------------------------------
KOR           2           1 KU Bonchan,Republic of Korea




####################################################################################################################################################################################        


create table olympic_medal_tables as   
       select * from (   
                     select noc, medal, sport, event, gender   
                        from olympic_medal_winners   
                     )   
          pivot ( count(distinct sport ||'#'|| event ||'#'||gender ) for medal in 
                            (   
                              'Gold' gold_medals, 'Silver' silver_medals, 'Bronze' bronze_medals   
                            )
               )   
              order  by 2 desc, 3 desc, 4 desc;

SQL> select * from olympic_medal_tables
  2  ;

NOC GOLD_MEDALS SILVER_MEDALS BRONZE_MEDALS
--- ----------- ------------- -------------
KOR           2             0             0
GBR           1             0             0
BRA           0             1             1
USA           0             1             1
FRA           0             1             0
AUS           0             0             1


select * from olympic_medal_tables   
              unpivot (medal_count for medal_colour in 
                          (   
                          gold_medals as 'GOLD',   
                          silver_medals as 'SILVER',   
                          bronze_medals as 'BRONZE'   
                          )
                      )   
                 order  by noc;

SQL> select * from olympic_medal_tables
  2  unpivot (medal_count for medal_colour in (
  3    gold_medals as 'GOLD',
  4    silver_medals as 'SILVER',
  5    bronze_medals as 'BRONZE'
  6  ))
  7  order  by noc;

NOC MEDAL_COLOUR MEDAL_COUNT
--- ------------ -----------
AUS SILVER                 0
AUS GOLD                   0
AUS BRONZE                 1
BRA BRONZE                 1
BRA SILVER                 1
BRA GOLD                   0
FRA SILVER                 1
FRA GOLD                   0
FRA BRONZE                 0
GBR SILVER                 0
GBR BRONZE                 0
GBR GOLD                   1
KOR SILVER                 0
KOR BRONZE                 0
KOR GOLD                   2
USA SILVER                 1
USA GOLD                   0
USA BRONZE                 1