SQL Server将FieldValue转置为FieldName

时间:2018-11-07 17:20:43

标签: sql sql-server transpose

SQL Server转置,将FieldValues作为FieldNames:

大家好, 我对所有人都有一个棘手的要求。

我有一张包含以下数据的表

Field1  Field2  Field3                      Field4
----------------------------------------------------
KEY1    01      FieldName1                  FieldValue1
kEY1    01      FieldName2                  FieldValue2
KEY1    01      FieldName3                  FieldValue3
KEY1    01      FieldName4                  FieldValue4

我可以使用数据透视进行转置,但是我希望结果是

Filed1  Field2  FieldName1   FieldName2   FieldName3     FieldName4   
--------------------------------------------------------------------
KEY1    01      FieldValue1  FieldValue2  FieldValue3    FieldValue4    

是否可以使用数据透视表而不使用XML?

谢谢。

1 个答案:

答案 0 :(得分:0)

您可以尝试使用条件汇总功能

SELECT Field1,
       Field2,
       MAX(CASE WHEN Field3 = 'FieldName1' THEN Field4 END) FieldName1,
       MAX(CASE WHEN Field3 = 'FieldName2' THEN Field4 END) FieldName2,
       MAX(CASE WHEN Field3 = 'FieldName3' THEN Field4 END) FieldName3,
       MAX(CASE WHEN Field3 = 'FieldName4' THEN Field4 END) FieldName4
FROM T
GROUP BY Field1,Field2

SQLFIDDLE

如果要动态创建列,可以尝试使用动态数据透视。

创建SQL语句,并通过连接SQL字符串使条件聚合函数。然后使用动态执行。

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX);

SET @cols = STUFF((SELECT distinct ', MAX(CASE WHEN Field3 = ''' + Field3+''' THEN Field4 END) ' + QUOTENAME(Field3) 
            FROM T
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

SET  @query= 'SELECT Field1,
       Field2, '+ @cols+ ' 
FROM T
GROUP BY Field1,Field2';

execute(@query)

sqlfiddle

结果

Filed1  Field2  FieldName1   FieldName2   FieldName3     FieldName4   
--------------------------------------------------------------------
KEY1    01      FieldValue1  FieldValue2  FieldValue3    FieldValue4