天天看點

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

引:

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

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

比較:

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

   select name,

       case Subject

          when '國文' then 1

          when '數學' then 2

          when '英語' then 3   --else 3

       end  as '科目代碼'

   from Results

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

   同樣的,我們可以用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

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

         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;

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

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

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

  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;

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

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

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; 

結果如下:

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

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

(續)

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')

注:引用自  http://www.cnblogs.com/NothingIsImpossible/archive/2010/10/13/1850250.html