SQL Pivot没有聚合

时间:2016-06-15 06:50:21

标签: sql-server pivot max aggregation

我在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以获得所有结果?

提前谢谢你!

1 个答案:

答案 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);

ONLINE DEMO

获得所需结果的另一种方法是使用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);

ONLINE DEMO