2017-09-24 52 views
0

我有两个表,tblColumnNamestblValues具有以下结构和示例值:变换行转换成列MS SQL

tblColumnNames - has two columns with names 'id' and 'ColumnName' 
and following example data: 
------------------------------- 
id     ColumnName 

0     columnName1 
1     columnName2 
2     columnName3 


tblValues has three columns 'id', 'ColumnId' and 'Value' with following example data: 
------------------------------- 

id    ColumnId    Value 

51    0      177 
52    1      abcde 
53    2      123 
54    0      40 
55    1      xyz 
56    2      321 

ColumnId对应于idtblColumnNames表。
如何连接这两个表,这样所产生的列是从tblValues值列采取tblColumnNames和各自的值的行:

result 
------------------------------ 
colummnName1  columnName2   columnName3 

177     abcde    123 
40     xyz     321 

编辑:中行tblColumnNames数量将不断变化。

+0

SQL查询不具有动态列名。如果你想拥有动态名称,你需要使用动态SQL。 –

+0

可能的重复[有效地将行转换为SQL Server中的列](https://stackoverflow.com/questions/15745042/efficiently-convert-rows-to-columns-in-sql-server) –

+0

@AlbertoMartinez该问题正在寻找用于替代PIVOT。我的问题是寻找一个通用的解决方案。 – astralmaster

回答

1

你可以试试这个。

DECLARE @ColNames NVARCHAR(MAX) ='' 
SELECT @ColNames = @ColNames + '['+ColumnName +']'+ ', 'FROM tblColumnNames ORDER BY id 
SET @ColNames = LEFT(@ColNames, LEN(@ColNames)-1) 

DECLARE @TheQuery NVARCHAR(MAX) 
SET @TheQuery = 'SELECT PVT.* FROM 
(SELECT V.Value, (V.id - V.ColumnId) RowGroupID, C.ColumnName FROM 
    tblValues V INNER JOIN tblColumnNames C ON V.ColumnId = C.id) AS SRC 
     PIVOT (MAX(VALUE) FOR ColumnName IN ('+ @ColNames +')) PVT' 

EXEC sp_executesql @TheQuery 

结果

RowGroupID columnName1 columnName2 columnName3 
----------- ----------- ----------- ----------- 
51   177   abcde  123 
54   40   xyz   321 
+0

对不起,我忘了提及tblColumnNames中的行数(因此为结果表的列)将不断更改 – astralmaster

+0

我更新了对已更改列的查询。 –

+0

谢谢,基本上它是关于'pivot'和动态生成列名 – astralmaster