此 SQL 程式碼動態地將行轉換為列,而不會遺失資料類型,這通常需要聚合函數。讓我們重新表達一下,使其更加清晰並提高可讀性。
在 SQL 中動態地將行轉換為列:型別保留解決方案
標準 SQL PIVOT
操作通常需要聚合函數(如 MAX
或 MIN
),這可能會導致資料遺失或類型強制。此範例示範了一種動態 SQL 方法,可將行轉換為列,同時保留原始資料類型,最多處理 12 個測試名稱。
挑戰在於將具有可變數量的測試名稱(最多 12 個)和混合資料類型的表轉換為每個測試名稱成為一列的表。 需要一個動態解決方案來適應這種變化。
動態 SQL 解決方案
這個解決方案巧妙地使用動態 SQL 根據資料本身建立樞軸查詢。
<code class="language-sql">DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX); SELECT @cols = STUFF((SELECT distinct ',' + QUOTENAME(TEST_NAME) FROM yourtable FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,''); SET @query = 'SELECT sbno,' + @cols + ' FROM ( SELECT test_name, sbno, val FROM yourtable ) x PIVOT ( MAX(val) FOR test_name IN (' + @cols + ') ) p;'; EXECUTE(@query);</code>
程式碼首先根據唯一的 @cols
值建立一個以逗號分隔的列名稱清單 (TEST_NAME
)。 然後,它使用 PIVOT
作為聚合函數來建構 @query
查詢 (MAX(val)
)。 當使用 MAX
時,因為我們以每個 SBNO 內的唯一值為基礎,這有效地保留了原始資料。 最後,執行產生的查詢。
說明性輸出
輸出表將為每個唯一的測試名稱有一列,並用原始表中的對應值填充,並保持其原始資料類型:
<code>| SBNO | TEST1 | TEST2 | TEST3 | --------------------------------- | 1 | 0.304 | 2.3 | PASS | | 2 | 0.31 | 2.5 | PASS | | 3 | 0.306 | 2.4 | (null) |</code>
此方法可以有效處理不同數量的測試名稱和不同的資料類型,為 SQL 中的動態旋轉提供強大的解決方案。 請記得將 yourtable
替換為您的表的實際名稱。
以上是如何在 SQL 中動態地將行轉換為列而不進行聚合?的詳細內容。更多資訊請關注PHP中文網其他相關文章!