将数据转换为行

时间:2018-03-02 16:31:11

标签: sql sql-server sql-server-2014

我有一个数据集,它与此类似:

name    measure    status
john doe    blood pressure    iscompliant
john doe    Hba1c             notcompliant
jane doe    BMI               iscompliant
jane doe    blood pressure    notcompliant

我将使用未知数量的措施,因此,如果有一种方法可以动态地执行此操作,那将是非常棒的。我正在寻找这样的结果集:

name      blood pressure    Hba1c          BMI       
john doe  iscompliant       notcompliant   null   
jane doe  notcompliant      null           iscompliant

我无法找到能够将两个列绑在一起的示例,就像我的示例中的状态和度量一样。我不确定是否需要交叉应用我的数据然后转动,或者我是否可以直接转向。感谢您的帮助,谢谢您的时间。

编辑:我正在使用sql server 2014

1 个答案:

答案 0 :(得分:0)

我最终自己弄清楚了。这不是我正在使用的真正解决方案,而是使用我上面发布的示例数据的解决方案,以便人们可以在将来引用此解决方案。

 DECLARE @DynamicPivotQuery AS NVARCHAR(MAX);
            DECLARE @ColumnName AS NVARCHAR(MAX);




--Get distinct values of the PIVOT Column 
            SELECT  @ColumnName = ISNULL(@ColumnName + ',' , '')
                    + QUOTENAME(Measure)
            FROM    ( SELECT DISTINCT
                                Measure
                      FROM      #temptable
                    ) AS qmdata;

--Prepare the PIVOT query using the dynamic 
            SET @DynamicPivotQuery = N'SELECT name, '
                + @ColumnName + '
                into workdb.dbo.qm_data_test
    FROM #temptable
    PIVOT(max(status)
          FOR measure IN (' + @ColumnName + ')) AS PVTTable';
--Execute the Dynamic Query
            EXEC sp_executesql @DynamicPivotQuery;

一旦我在workdb中使用它,我运行它来重复数据:

SELECT  name
      ,MAX(measure1)
      ,MAX(measure2)
      ,MAX(measure3)
  FROM [workdb].[dbo].[qm_data_test]
  GROUP BY name

我即将为第二个查询编写动态sql,因此我不必手动编码MAX(ColumnName),的每一次出现,因此如果添加了一个度量,我的代码将会选择它。