SQL行列轉換,二次轉換及新增 小計 總結

2022-09-12 05:15:08 字數 3543 閱讀 3882

原始table資料

把month列轉為行頭&新增總計、小計

1

--分類彙總

2select

3isnull

(prdlb,'總計

') asprdlb,

4isnull([

month],

'小計')

as[month],

5case

when

prdlb

isnull

then

/*如果是總計列,(本月合-上月合)/上月*/6

convert

(varchar

,convert

(numeric(8,

2),round

((sum

(r1)

-sum

(r2))

*100

/sum

(r2),

2)))+'

%'7else

8convert

(varchar

,sum

(divide))+'

%'9end

asdivide

10into

#tempresult_total

11from

#tempresult

12group

byprdlb,

[month]13

with

cube

14--

15--

行列轉換

16declare

@str

nvarchar

(max)17

declare

@str2

nvarchar

(max)18

declare

@sql

nvarchar

(max)19

set@str=''

20set

@str2=''

21set

@sql='

select prdlb,'22

select

@str

=@str+'

,isnull(['+

month+'

],0) as ['+

month+'

]'from

(select

distinct

(month

) from

#tempresult_total)

ast1

/*生成select後的列名

*/23

select

@str2

=@str2+'

,['+month+'

]'from

(select

distinct

(month

) from

#tempresult_total )

ast2

24set

@str

=right

(@str

,len

(@str)-

1)25set

@str2

=right

(@str2

,len

(@str2)-

1)26set

@sql

=@sql

+@str+'

from #tempresult_total pivot (max(divide) for month in ('+

@str2+'

)) as t '27

exec

(@sql

)

結果

以上轉換的前提是原始table資料列只有一行divide

但遇到如下table時【month對應多個資料列】,需轉換兩次

第一步:增加result列,把原列名以item列的資料形式存在

select

month

,item,result

--into #tempresult2

from

#tempresult

unpivot

/*列轉行*/(

result

foritem in(

sum,cut,cost)

) as

unpvt

結果

然後就類似前面提到的操作

--

再將月份從行轉成列

declare

@str

nvarchar

(max

) declare

@str2

nvarchar

(max

) declare

@sql

nvarchar

(max

) set

@str=''

set@str2=''

set@sql='

select item,

'select

@str

=@str+'

,isnull(['+

month+'

],0) as ['+

month+'

]'from

(select

month

from

#tempresult)

ast1

/*生成select後的列名

*/select

@str2

=@str2+'

,['+month+'

]'from

(select

month

from

#tempresult )

ast2

set@str

=right

(@str

,len

(@str)-

1) set@str2

=right

(@str2

,len

(@str2)-

1)set@sql

=@sql

+@str+'

from #tempresult2 pivot (sum(result) for month in ('+

@str2+'

)) as t

'exec

(@sql

)

轉換兩次後的結果

SQL小技巧 行列互轉,換行,根據條件顯示不同內容

sql小技巧 1 行列互轉 1 建立乙個表 create table tb1 姓名 varchar 10 語文 int 數學 int 物理 int 插入兩條資料 insert into tb1 姓名 語文 數學 物理 values 張三 74,83,93 insert into tb1 姓名 語文 ...

簡單的敘述下SQL中行列轉換的小知識!

行列轉換對於工作還是學習中總是不可避免的會遇到 雖然本人還尚未工作,萌萌噠的學生一枚 解決的方法也有很多,我這裡就總結一下我所想解決的問題以及怎麼去解決的方法,可能網上已經有很多類似的方法了,有的比我的可能會更好,就當我記錄一下自己的學習經歷吧。這裡我們列舉乙個關於 的每日入賬出賬做乙個統計然後整理...

revit二次開發之單位轉換

revit內部基本單位是英呎,如果要獲取或設定構件引數數值需要進行單位轉換,比如轉換為基本的公釐或公尺等單位 1.可以使用常規方式進行轉換 1英呎等於0.3047999995367公尺,等於304.7999995367公釐 2.可以使用revitapi內建的轉換函式進行目標單位的轉換 使用unitu...