SQL Server 行列轉換 1

2022-02-14 06:05:50 字數 2536 閱讀 3697

參考前乙個sql的行列轉換例子 ,覺得不夠自由,需要去預先知道記錄的內容去定義行或列。

下面這個方法,是insus.net常用一種處理方案,為資料量較少而準備。**比較長,基本上寫有說明,理解起來,一般不會有多大困難。

**如下:

view code

--由於原記錄表沒有乙個唯一主鍵,只好新建乙個臨時表,把需要處理的記錄先預存入這個臨時表中

begin

ifobject_id('

[dbo].[#t]') 

isnot

null

drop

table

[dbo].

[#t]create

table

[dbo].

[#t](

id int

identity(1

,1),  

rid 

nvarchar(2

),dt date,

hits 

int)

insert

into

[dbo].

[#t]select

[rid],

[dt],

[hits

]from

[dbo].

[recordhits

]end

--建立乙個臨時表,為處理記錄所需要表最初表結構

begin

ifobject_id('

[dbo].[#rlist]') 

isnot

null

drop

table

[dbo].

[#rlist

]create

table

[dbo].

[#rlist](

rid 

nvarchar(2

))endbegin

--宣告一些變數,為迴圈記錄時所應用

declare

@nint=1

, @r

intdeclare

@rid

nvarchar(2

),@dt

date

declare

@hits

intset@r=

(select

max([id

]) from

[dbo].

[#t])

while

@n<=

@rbegin

--取出每筆記錄值

select

@rid=[

rid]

,@dt=[

dt],@hits=[

hits

]from

[dbo].

[#t]where[id

]=@n--

把日期轉換為字串

declare

@cnvarchar(10

) =convert

(nvarchar(10

),@dt

,112)--

判斷此次迴圈的日期作為臨時表[dbo].[#rlist]乙個字段,如果不存在,修改這個臨時表,增加字段,反之,將略去執行下面sql語句        

execute('

if not exists(select name from tempdb..syscolumns where id=object_id(

''tempdb..[#rlist]

'') and tempdb..syscolumns.name =

'''+@c+

''') alter table tempdb..[#rlist] add ['+

@c+'] nvarchar(10)')

--判斷此次迴圈的記錄在臨時表是否存在,如果不存在

ifnot

exists

(select

[rid

]from

[dbo].

[#rlist

]where

[rid]=

@rid)--

插入此記錄

insert

into

[dbo].

[#rlist](

[rid]) 

values

(@rid

)    

--更新記錄。

execute('

update [dbo].[#rlist] set ['+

@c+'] = 

'''+

@hits

+'''

where [rid] = 

'''+

@rid

+'''')--

迴圈下一筆

set@n=@n

+1endend

--查詢處理結果

select

*from

[dbo].

[#rlist

]執行結果:

SQL Server行列轉換

行列轉換應該非常廣泛,也就是常說的交叉表,範例如下 注意事項 資料庫相容性級別 sql server 2005 90 建立臨時測試表 create table test 姓名 varchar 10 課程 varchar 10 分數 int insert into test values 張三 語文 ...

SQL Server 行列轉換

報表顯示需求,查詢結果往往需要做一些行列轉換或列行轉換來顯示。就以這個例子的資料來源做演示。正常查詢結果顯示和執行結果,如下 下面演示,把 rid 和 dt 作為列顯示 view code select rid sum case when dt 2011 01 23 then hits end as...

SQL Server 行列轉換 2

參考前乙個例子現想使用另外一種方式來處理行列轉換,實現下面效果 產生唯一字段,稍後為迴圈使用 rid nvarchar 2 dt date,hits int 把需要處理的資料記錄預存入這個臨時表中 insert into dbo t select rid dt hits from dbo recor...