我想以下面代碼中概述的方式轉置從 SQL 查詢回傳的資料。
鑒于:
CREATE TABLE #TempTable(RowId INT, ColumnName VARCHAR(20), ColumnValue VARCHAR(20))
INSERT INTO #TempTable
VALUES
(0, 'First Name', 'David'),
(1, 'First Name', 'Sarah'),
(0, 'Last Name', 'Jones'),
(1, 'Last Name', 'Vaughan')
我想產生一個這樣的結果集:
[RowID] | [First Name] | [Last Name]
0 | David | Jones
1 | Sarah | Vaughan
最好在 SQL Server 2016 上
uj5u.com熱心網友回復:
條件聚合提供更多的靈活性/控制( 1 Stu),但如果您正在尋找一個簡單的 PIVOT...
請記住僅使用所需的列“饋送”您的 PIVOT。
例子
Select *
From #TempTable
Pivot ( max(ColumnValue) for ColumnName in ( [First Name],[Last Name] ) ) pvt
結果
RowId First Name Last Name
0 David Jones
1 Sarah Vaughan
uj5u.com熱心網友回復:
你在Pivot之后,在 Stack Overflow 和其他地方有數百個這樣做的例子。
但是,實作這樣的條件案例非常簡單:
select RowId,
Max(case when ColumnName='First Name' then ColumnValue end) [First Name],
Max(case when ColumnName='Last Name' then ColumnValue end) [Last Name]
from #TempTable
group by RowId
如果您有更多值,您可以按照相同的模式添加這些值。
uj5u.com熱心網友回復:
從我從@John-Cappelletti 的答案中學到的知識進行擴展,我想出了這個解決方案,它結合了 XML 路徑查詢來幫助構建動態 sql 查詢。這適用于未知數量的 ColumnName 值。
在這里發布,因為它可能對其他人有用
CREATE TABLE #TempTable(RowId int, ColumnName VARCHAR(20), DataValue VARCHAR(20))
INSERT INTO #TempTable
VALUES
(0, 'First Name', 'David'),
(1, 'First Name', 'Sarah'),
(0, 'Last Name', 'Jones'),
(1, 'Last Name', 'Vaughan'),
(0, 'Age', '100'),
(1, 'Age', '50')
-- Get the column names in the format [Name 1], [Name 2]
-- as required for the Pivot query
DECLARE @ColumnNames VARCHAR(MAX) = (
SELECT DISTINCT '[' ColumnName ']' ',' AS 'data()'
FROM #TempTable
FOR XML path('')
)
--- Remove the trailing comma (must be a better way to do this)
SET @ColumnNames = LEFT(@ColumnNames, LEN(@ColumnNames) - 1)
--- Build the Pivot query
DECLARE @SqlQuery VARCHAR(MAX) =
'Select *
From #TempTable
Pivot ( max(DataValue) for ColumnName in (' @ColumnNames ') ) pvt'
EXEC(@SqlQuery)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/447366.html
