將表1轉化成表2:
表1
表2得到表2的結果,需要經過多次pivot轉換,再經union連線到一起,**如下:
1view codeselect id, type,sum([
1]) [
1],sum([
2]) [
2],sum([
3]) [
3],sum([
4]) [4]
from2(
3select'a
'as type, *
from
table_1
4 pivot(sum(a) for p in([
1],[
2],[
3],[
4])) asa 5
union
all6
select'b
'as type,*
from
table_1
7 pivot(sum(b) for p in([
1],[
2],[
3],[
4])) asb8
union
all9
select'c
'as type,*
from
table_1
10 pivot(sum(c) for p in([
1],[
2],[
3],[
4])) asc11
union
all12
select'd
'as type,*
from
table_1
13 pivot(sum(d) for p in([
1],[
2],[
3],[
4])) asd14
) t1
15group
byid,type
16order
by id,type
此時**看起來比較多,如果需要n多次pivot轉換,**過於繁多。
此時,可通過定義乙個變數,以拼字串的形式,來代替繁多的**:
1view codedeclare
@str
varchar(8000
) 2
set@str=''
3select
@str
=@str+'
select
'''+ name +
'''as type,* from table_1 pivot(sum(
'+ name +')
4for p in ([1],[2],[3],[4])) as
'+ name +
'union all '5
from
syscolumns
6where
object_id('
table_1
') = id and name <>'p
'and name <>'id
'7select
@str
=left(@str,len(@str)-
len('
union all'))
8select
@str='
select id, type,sum([1]) [1],sum([2]) [2],sum([3]) [3],sum([4]) [4] from ('+
@str+'
) t1 group by id,type order by id,type'9
exec (@str)
兩種方法得出的結果是一樣的,只是後者**更為簡潔。
Oracle 行列轉置
兩種簡單的行列轉置 1 固定列數的行列轉換 如student subject grade student1 語文 80 student1 數學 70 student1 英語 60 student2 語文 90 student2 數學 80 student2 英語 100 轉換為 語文 數學 英語 s...
SQL 行列轉置
我學會了第二種方法 sql2005中的方法 create table tb id int,value varchar 10 insert into tb values 1,aa insert into tb values 1,bb insert into tb values 2,aaa insert...
Oracle 行列轉置
兩種簡單的行列轉置 1 固定列數的行列轉換 如student subject grade student1 語文 80 student1 數學 70 student1 英語 60 student2 語文 90 student2 數學 80 student2 英語 100 轉換為 語文 數學 英語 s...