sql server多重行列轉置的優化

2022-08-31 02:45:10 字數 2022 閱讀 7063

將表1轉化成表2:

表1

表2得到表2的結果,需要經過多次pivot轉換,再經union連線到一起,**如下:

1

select 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

view code

此時**看起來比較多,如果需要n多次pivot轉換,**過於繁多。

此時,可通過定義乙個變數,以拼字串的形式,來代替繁多的**:

1

declare

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

view code

兩種方法得出的結果是一樣的,只是後者**更為簡潔。

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...