SQL Server 行列转换(1)
生活随笔
收集整理的這篇文章主要介紹了
SQL Server 行列转换(1)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
參考前一個SQL的行列轉換例子http://www.cnblogs.com/insus/articles/1969896.html ,覺得不夠自由,需要去預先知道記錄的內容去定義行或列。
下面這個方法,是Insus.NET常用一種處理方案,為數據量較少而準備。代碼比較長,基本上寫有說明,理解起來,一般不會有多大困難。
代碼如下:?
View Code --由于原記錄表沒有一個唯一主鍵,只好新建一個臨時表,把需要處理的記錄先預存入這個臨時表中BEGIN
????IF?OBJECT_ID?('[dbo].[#t]')?IS?NOT?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
IF?OBJECT_ID('[dbo].[#rList]')?IS?NOT?NULL
DROP?TABLE?[dbo].[#rList]
CREATE?TABLE?[dbo].[#rList]
(
????RId?NVARCHAR(2)
)
END
BEGIN
????
????--宣告一些變量,為循環記錄時所應用
????DECLARE?@N?INT?=?1,?@R?INT
????DECLARE?@RId?NVARCHAR(2),@DT?DATE
????DECLARE?@Hits?INT
????
????SET?@R?=?(SELECT?MAX([id])?FROM?[dbo].[#t])
????WHILE?@N?<=?@R?
????BEGIN
????????--取出每筆記錄值
????????SELECT?@RId?=?[RId],@DT?=?[DT],@Hits?=?[Hits]?FROM?[dbo].[#t]?WHERE?[id]?=?@N????????
????????--把日期轉換為字符串
????????DECLARE?@C?NVARCHAR(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)')
????????
????????--判斷此次循環的記錄在臨時表是否存在,如果不存在
????????IF?NOT?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?+?1
????END
END
????--查詢處理結果
????SELECT?*?FROM?[dbo].[#rList]????
?
執行結果:
?
總結
以上是生活随笔為你收集整理的SQL Server 行列转换(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [IE9] 开发IE9上的屏幕取词功能
- 下一篇: 100题_08 求1+2+...+n