不幸的是,您唯一的选择是使用动态 SQL 来做某事。下面是一些执行动态数据透视的示例代码。
CREATE TABLE #tblA
(
BLK VARCHAR(100)
,COLUMN_ID INT
,VALUE VARCHAR(100)
)
INSERT INTO #tblA
(
BLK
,COLUMN_ID
,VALUE
)
VALUES
('BLOCK 1', 1, 'AA')
,('BLOCK 1', 2, 'BB')
,('BLOCK 1', 3, 'CC')
,('BLOCK 2', 1, 'AAAA')
,('BLOCK 2', 2, 'BBBB')
,('BLOCK 2', 3, 'CCCC')
,('BLOCK 2', 4, 'DDDD')
,('BLOCK 3', 1, 'AAAAAA')
,('BLOCK 3', 2, 'BBBBBB')
,('BLOCK 3', 3, 'CCCCCC')
,('BLOCK 4', 1, 'AAAAAAAA')
,('BLOCK 4', 2, 'BBBBBBBB')
,('BLOCK 4', 3, 'CCCCCCCC')
,('BLOCK 4', 4, 'DDDDDDDD')
--END DEMO SETUP
DECLARE @sql NVARCHAR(MAX) = N'';
DECLARE @cols NVARCHAR(MAX) = N''
--BUILD LIST OF COLUMNS TO PIVOT
SELECT @cols += ',' + QUOTENAME('CO' + CAST(COLUMN_ID AS VARCHAR(10))) FROM #tblA GROUP BY COLUMN_ID
SELECT @cols = STUFF(@cols, 1,1,'')
--SELECT @cols
SELECT @sql = 'SELECT BLK, ' + @cols
+ ' FROM ('
+ ' SELECT BLK, ''CO'' + CAST(COLUMN_ID AS VARCHAR(10)) AS ColName, Value FROM #tblA'
+ ') data'
+ ' PIVOT('
+ ' MAX(VALUE)'
+ ' FOR ColName IN (' + @cols + ')'
+ ') AS pvt'
PRINT @sql
EXEC(@sql)