前幾天,剛參加工作的同學提一出問題:SQL Server中如何將一列數據以一行的方式顯示出來?
當時在看有關SQL中行列互轉的問題,便以行列互轉的方式考慮了一下,沒有得出解決方法;后又到園子里搜索了一下,也沒搜索到比較好的方法,有些方法又太復雜,以目前的水平還吃不透,因為他的問題就比較簡單,沒考慮程序中的處理,也沒說大數據量時會怎么樣,只是單純地想一想如何實現?
之后試出來了一個方法,比較簡單,以下列出代碼:
--步驟1:准備測試用的表和數據 IF OBJECT_ID('report') IS NOT NULL --當前數據庫中如果已存在report表,則刪除 DROP TABLE report GO CREATE TABLE report --創建report測試表 ( stuName NVARCHAR(20) NOT NULL, stuReport DECIMAL(12,0) NULL ) GO INSERT INTO report(stuName,stuReport) --往表中插入測試數據 SELECT '王小芳',80 UNION ALL SELECT '林志強',75 UNION ALL SELECT '劉瑞英',97 UNION ALL SELECT '趙華飛',65 UNION ALL SELECT '張錦雲',55 UNION ALL SELECT '張建國',67 GO --查詢表中數據 SELECT stuName,stuReport FROM report ORDER BY stuReport GO
表中的數據如圖所示:
現在將成績一列以一行的方式查詢顯示出來,代碼如下:
--步驟2:實現一列轉一行 DECLARE @var NVARCHAR(4000) SET @var='' SELECT @var=@var+','+CAST(stuReport AS NVARCHAR(10))+ ' AS ''column'+CAST(stuReport AS NVARCHAR(10))+'''' --自定義列名顯示 FROM report --將report表中的stuReport數據轉換成字符串拼接進@var變量,每條數據之間以英文逗號分隔 ORDER BY stuReport SET @var=STUFF(@var,1,1,'') --去掉@var中的第一個逗號 SELECT @var --測試輸出拼好的@var EXEC('SELECT '+@var) --在@var前添加SELECT關鍵字,組成一條SELECT語句,並執行這條語句 GO
拼接好的@var變量的值如下:
55 AS 'column55',65 AS 'column65',67 AS 'column67',75 AS 'column75',80 AS 'column80',97 AS 'column97'
在此字符串前再拼接上SELECT(注意有一空格),即可組成一條SELECT語句,再通過EXEC執行,最終得到的效果如下圖所示:
了解了代碼實際情況后,大家都看出這是一個有點投機取巧的方式,比較傻瓜式;第一次發表隨筆,以后會繼續努力!