我有一个数据集,它与此类似:
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
答案 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),
的每一次出现,因此如果添加了一个度量,我的代码将会选择它。