SQL排序错误

时间:2013-12-06 09:14:35

标签: sql sql-server

我有以下代码:

    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

1 个答案:

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