我有以下代码:
declare @SQLTempCols nvarchar(max)
declare @tempcolumns nvarchar(max)
set @SQLTempCols = '
SELECT @tempcolumns = STUFF(( SELECT DISTINCT TOP 100 PERCENT''],['' + t2.FUL_Name
FROM '+Cast( @ManagementFrom as nvarchar(max))+'.FunctionalUnitLevels AS t2
ORDER BY ''],['' + t2.FUL_Name
FOR XML PATH('''')), 1, 2, '''') + '']''
SET @tempcolumns = REPLACE(REPLACE(@tempcolumns, ''-'', ''''), '' '', '''')
SELECT @tempcolumns = REPLACE(@tempcolumns, '']'', ''] nvarchar(max)'')
'
exec sp_executesql @SQLTempCols, N'@tempcolumns nvarchar(max) OUTPUT', @tempcolumns OUTPUT
结果很好,但我想按Fun_ID排序列,而不是名字。 我该怎么做呢?
Edit: FunctionalUnitLevels
FUL_ID | FUL_name | FUL_Description
-----------------------------------
1 |Department |Department
2 |Sub-Department|Sub-Department
3 |Area |Area
答案 0 :(得分:0)
您可以使用DISTINCT
来获取唯一结果,而不是使用GROUP BY
,但这假定每个Ful_Name
只有一个Ful_ID
):
所以你的子查询会变成类似的东西:
SELECT '], [' + t2.Ful_Name
FROM T AS t2
GROUP BY t2.Ful_name, t2.Ful_ID
ORDER BY t2.Ful_ID
FOR XML PATH('''')
如果每个Ful_Name
都有Ful_ID
的多个值,那么您需要使用聚合函数来排序和维护Ful_Name
的唯一行,例如
SELECT '], [' + t2.Ful_Name
FROM T AS t2
GROUP BY t2.Ful_name
ORDER BY MIN(t2.Ful_ID)
FOR XML PATH('''')
注意 - 不需要TOP 100 PERCENT,因为当您使用FOR XML时,您可以在子查询中指定order by子句
因此,根据上述两种情况中的哪一种描述您的情况,您可以使用:
declare @SQLTempCols nvarchar(max)
declare @tempcolumns nvarchar(max)
set @SQLTempCols = '
SELECT @tempcolumns = STUFF(( SELECT ''],['' + t2.FUL_Name
FROM '+Cast( @ManagementFrom as nvarchar(max))+'.FunctionalUnitLevels AS t2
GROUP BY t2.FUL_Name, t2.Ful_ID
ORDER BY t2.Ful_ID
FOR XML PATH('''')), 1, 2, '''') + '']''
SET @tempcolumns = REPLACE(REPLACE(@tempcolumns, ''-'', ''''), '' '', '''')
SELECT @tempcolumns = REPLACE(@tempcolumns, '']'', ''] nvarchar(max)'')
'
exec sp_executesql @SQLTempCols, N'@tempcolumns nvarchar(max) OUTPUT', @tempcolumns OUTPUT
或者
declare @SQLTempCols nvarchar(max)
declare @tempcolumns nvarchar(max)
set @SQLTempCols = '
SELECT @tempcolumns = STUFF(( SELECT ''],['' + t2.FUL_Name
FROM '+Cast( @ManagementFrom as nvarchar(max))+'.FunctionalUnitLevels AS t2
GROUP BY t2.FUL_Name
ORDER BY MIN(t2.Ful_ID)
FOR XML PATH('''')), 1, 2, '''') + '']''
SET @tempcolumns = REPLACE(REPLACE(@tempcolumns, ''-'', ''''), '' '', '''')
SELECT @tempcolumns = REPLACE(@tempcolumns, '']'', ''] nvarchar(max)'')
'
exec sp_executesql @SQLTempCols, N'@tempcolumns nvarchar(max) OUTPUT', @tempcolumns OUTPUT