我在SQL结果的列中转换行时遇到问题。
我的结构是这样的:
GUID | PropertyName |的PropertyValue
abcd |专有名称| CN = ABCD ...
ABCD | CN | cn = GROUP _
ABCD |操作| ADD
1231 | distinguishedName来| CN = 123dd
1231 | Cn | CN = ASDGRUOP
1231 |操作| DEL
以前我不知道有n个PropertyNames,它们是动态的 - 我可以通过SQL获取它们,这不是问题。
我希望有这样的结构: GUID |专有名称| CN |操作
ABCD | CN = ABCD ... | cn = GROUP_ | ADD
1231 | cn = 123dd | cn = ADSGROUP | DEL
等等。
我通过这个SQL得到的列标题:
select @cols = STUFF (( SELECT DISTINCT '],[' + x.ParameterName from ... and parametername in ('PropertyValue','DistinguishedName', 'Operation')
FOR XML PATH ('')),1,2,'') + ']'
我可以用PIVOT-Function做到这一点但因为我没有聚合,我无法得到正确的结果:
set @query = N'SELECT '+ @cols + ' FROM (
SELECT x.parametervalue, x.parametername
from ... and parametername in (''PropertyValue'',''DistinguishedName'', ''Operation'')
) a
PIVOT (max(a.parametervalue) FOR ParameterName in ( ' + @cols + ')) as pv;'
exec sp_executesql @query;
我得到以下结果:
GUID |专有名称| CN |操作| ...其他Propertys
abcd | cn = abcd ... | cn = GROUP_ | ADD | ...
只有1个结果 - 而不是更多。但是这个查询有700个结果,因为MAX()函数只得到一个。如何获得没有聚合的Pivot以获得所有结果?
提前谢谢你!
答案 0 :(得分:1)
以下是动态PIVOT
查询:
DECLARE @sql NVARCHAR(MAX),
@cols NVARCHAR(MAX);
SELECT @cols =
STUFF((
SELECT DISTINCT ',' + QUOTENAME(PropertyName)
FROM #tbl
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
, 1, 1, '')
SELECT @sql =
'SELECT GUID, ' + @cols + '
FROM (
SELECT
GUID, PropertyName, PropertyValue
FROM #tbl
) t
PIVOT
(
MAX(PropertyValue)
FOR PropertyName IN(' + @cols + ')
) p ';
PRINT (@sql);
EXEC (@sql);
获得所需结果的另一种方法是使用dynamic crosstab:
DECLARE @sql NVARCHAR(MAX);
SELECT @sql =
'SELECT
GUID' + CHAR(10) +
(SELECT DISTINCT
' , MAX(CASE WHEN PropertyName = ''' + PropertyName + ''' THEN PropertyValue END) AS ' + QUOTENAME(PropertyName) + CHAR(10)
FROM #tbl
FOR XML PATH('')
) +
'FROM #tbl
GROUP BY GUID;';
PRINT (@sql);
EXEC (@sql);