引:
為了舉例說明,這裡建立了一張成績表,如所示:
比較:
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')