[SQL] 資料的轉置
又是一個簡單的 SQL ,作用應該不大,但是對我來說還蠻好用的,也算是個簡單的練習用 SQL
這裡的轉置不是在說樞紐分析的 PIVOT 及 UNPIVOT ,而是單純資料呈現的轉置
通常我們下的 SQL 可能如下:
但是我真的覺得這種橫向的有時會看的很亂,所以我改寫了相關的 CODE
讓輸出的呈現為"直列"來呈現,這段 SQL 主要使用到了 CTE, FOR XML 及 sp_executesql
透過這樣的 SQL 就達成了資料轉置的動作了,但如果需要回傳多筆資料,會有些許問題 當然,這應該也是呈現的 SQL 作調整可能就可以解決的問題,只是因為我只是要看特定單筆資料,那個小問題我就不特別思考怎處理了,或許只要透過 PIVOT 方式來呈現即可處理也說不定 (暫時就不考慮處理的方法了!)
這裡的轉置不是在說樞紐分析的 PIVOT 及 UNPIVOT ,而是單純資料呈現的轉置
通常我們下的 SQL 可能如下:
SELECT * FROM tempdb.dbo.temptable
但是我真的覺得這種橫向的有時會看的很亂,所以我改寫了相關的 CODE
讓輸出的呈現為"直列"來呈現,這段 SQL 主要使用到了 CTE, FOR XML 及 sp_executesql
DECLARE @DBCatalog NVARCHAR(128) = N'tempdb' DECLARE @DBSchema NVARCHAR(128) = N'dbo' DECLARE @DBTable NVARCHAR(128) = N'temptable' DECLARE @Condition NVARCHAR(MAX) = N'ID = 1' DECLARE @SQL NVARCHAR(MAX) SET @SQL = N'SET @SQL = STUFF((SELECT N'' UNION ALL SELECT N'''''' + COLUMN_NAME + N'''''', CONVERT(NVARCHAR, '' + COLUMN_NAME + N'') FROM T'' FROM ' + QUOTENAME(@DBCatalog) + '.INFORMATION_SCHEMA.COLUMNS WHERE TABLE_CATALOG = @DBCatalog AND TABLE_SCHEMA = @DBSchema AND TABLE_NAME = @DBTable FOR XML PATH(N'''')), 1, 11, N'''')' exec sp_executesql @SQL, N'@DBCatalog NVARCHAR(128), @DBSchema NVARCHAR(128), @DBTable NVARCHAR(128), @SQL NVARCHAR(MAX) OUTPUT', @DBCatalog = @DBCatalog, @DBSchema = @DBSchema, @DBTable = @DBTable, @SQL = @SQL OUTPUT SET @SQL = N';WITH T AS (SELECT * FROM ' + QUOTENAME(@DBCatalog) + N'.' + QUOTENAME(@DBSchema) + N'.' + QUOTENAME(@DBTable) + N'' + (CASE WHEN ISNULL(@Condition, N'') <> N'' THEN N' WHERE ' + @Condition ELSE N'' END) + N') ' + @SQL exec sp_executesql @SQL
透過這樣的 SQL 就達成了資料轉置的動作了,但如果需要回傳多筆資料,會有些許問題 當然,這應該也是呈現的 SQL 作調整可能就可以解決的問題,只是因為我只是要看特定單筆資料,那個小問題我就不特別思考怎處理了,或許只要透過 PIVOT 方式來呈現即可處理也說不定 (暫時就不考慮處理的方法了!)
留言
張貼留言