sql與oracle中有關case和decode的用法(行轉列)及比較

來源:互聯網
上載者:User

引:

         為了舉例說明,這裡建立了一張成績表,如所示:

        

比較:

         1、sql中,這兩個函數我們僅能使用case,代碼及結果如下:

   select name,
       case Subject
          when '語文' then 1
          when '數學' then 2
          when '英語' then 3   --else 3
       end  as '科目代碼'
   from Results

  

   同樣的,我們可以用case實現行轉列,代碼及結果如下:

   select Name,
            sum(case when Subject='語文' then Result end) '語文',
            sum(case when Subject='數學' then Result end) '數學',
            sum(case when Subject='英語' then Result end) '英語'
   from Results
   group by Name

  

  

         2、但是,在oracle中,這兩個函數我們都可以使用,代碼及結果如下:

             decode用法:select Name,decode(Subject,'語文',1,'數學',2,'英語',3) 科目代碼 from results;

                               select Name,decode(Subject,'語文',1,'數學',2,3) 科目代碼 from Results;

                 case用法:

  select name,
       case
          when Subject='語文' then 1
          when Subject='數學' then 2
          when Subject='英語' then 3  --else 3
       end  as 科目代碼
  from Results;

  這兩種方法均能達到同樣的結果:

 

  同樣的,我們可以使用這兩個函數實現行轉列,代碼及結果如下:

  decode:

select
   Name,
   sum(decode(Subject,'語文',Result,0)) 語文,
   sum(decode(Subject,'數學',Result,0)) 數學,
   sum(decode(Subject,'英語',Result,0)) 英語
from Results
group by Name;

     case:

select
   Name,
   sum((case when Subject='語文' then Result else 0 end)) 語文,
   sum((case when Subject='數學' then Result else 0 end)) 數學,
   sum((case when Subject='英語' then Result else 0 end)) 英語
from Results
group by Name;

 

資料庫表與行轉列的中間結果(想想還是也附上)

oracle中:

select
   Name,
   decode(Subject,'語文',Result,0) 語文,
   decode(Subject,'數學',Result,0) 數學,
   decode(Subject,'英語',Result,0) 英語
from Results;

select
   Name,
   (case when Subject='語文' then Result else 0 end) 語文,
   (case when Subject='數學' then Result else 0 end) 數學,
   (case when Subject='英語' then Result else 0 end) 英語
from Results; 

結果如下:

以上內容,不對的地方請指正。此文僅想拋磚引玉...

(續)

SQL2000中動態SQL

declare @sql varchar(8000)
set @sql = 'select name '
select @sql = @sql + ' , sum(case Subject when '+ char(39) + Subject + char(39) +' then Result else 0 end) [' + Subject + ']'
from (select distinct Subject from results) as a
set @sql = @sql + ' from results group by name'
exec(@sql)

 

SQL2005中動態SQL

declare @sql varchar(8000)
select @sql = isnull(@sql + '],[' , '') + Subject from Results group by Subject
set @sql = '[' + @sql + ']'
exec ('select * from  Results pivot (max(result) for subject in (' + @sql + ')) b')

 

 

    

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.