如何在ssrs报告中对逗号分隔列表中的数据进行排序

时间:2017-04-05 19:12:38

标签: tsql reporting-services

我在使用COALESCE关键字制作的单元格上有逗号分隔列表,如下所示:

SELECT 
    @RelatorFirmDeals = COALESCE(@RelatorFirmDeals + ', ', '') + ISNULL(H.dtm_unittypename, '') + '-' + ISNULL(CAST(H.dtm_unitno as nvarchar(5)), '')
FROM 
    FilteredOpportunity O 
INNER JOIN 
    Filtereddtm_unit H ON O.pcrm_homeid = H.dtm_unitid
WHERE
    O.dtm_project = @ProjectId AND 
    NOT O.pcrm_rdeid IS NULL AND
    O.statuscode = 265780001

如何对此列表进行排序?

由于

2 个答案:

答案 0 :(得分:0)

这是一种适合您的方法。

首先,从this问题的答案中获取udf_Split用户定义函数(UDF)。使用此UDF,您可以将分隔的字符串作为参数传递,并返回一个表,每个值都有一行。

一旦你有了这个,那么你需要做的就是以下面的方式使用UDF。

DECLARE @RelatorFirmDeals VARCHAR(8000) = 'G2-18, G3-21, G2-13, G-15, G1-16, G2-17, G3-9, G1-11, G2-12, B2-22, B-23, B-24, B1-25, B-28, B-29, B-30, B2-31, F2-69, F-70, F-71, F-72'

SELECT LTRIM(STUFF((SELECT ', ' + RTRIM(LTRIM(Value))
    FROM dbo.udf_Split(@RelatorFirmDeals, ',')
    ORDER BY 1 FOR XML PATH ('')), 1, 2, ''));

这将是结果字符串:

B-23, B-24, B-28, B-29, B-30, B1-25, B2-22, B2-31, F-70, F-71, F-72, F2-69, G-15, G1-11, G1-16, G2-12, G2-13, G2-17, G2-18, G3-21, G3-9

希望这会有所帮助。

答案 1 :(得分:0)

这基本上是分解字符串并将其放入表变量,对表进行排序,然后将其放回字符串中。有一点需要注意的是,由于它被排序为一个字符串而不是整数,G-9将在G-10之后。如果你想按字母顺序对数字进行排序,那么你需要将字符串分为2列,1表示字母,1表示数字,然后进行相应的排序。

如果您有SQL Server 2016,则可以使用string_split函数简化此操作。

以下是查询:

DECLARE @input_string NVARCHAR(MAX) = 'G2-18, G3-21, G2-13, G-15, G1-16, G2-17, G3-9, G1-11, G2-12, B2-22, B-23, B-24, B1-25, B-28, B-29, B-30, B2-31, F2-69, F-70, F-71, F-72'
DECLARE @delimiter NVARCHAR(MAX) = ', '

DECLARE @output_string NVARCHAR(MAX) = ''

DECLARE @values_table TABLE (
string_values NVARCHAR(MAX)
)

WHILE (SELECT LEN(@input_string) - LEN(REPLACE(@input_string,@delimiter,''))) > 0
BEGIN
    INSERT @values_table
    SELECT SUBSTRING(@input_string,0,CHARINDEX(', ',@input_string))

    SET @input_string = SUBSTRING(@input_string,CHARINDEX(@delimiter,@input_string)+2,LEN(@input_string))
END

INSERT @values_table
SELECT @input_string

DECLARE @row_counter INT = 1

WHILE @row_counter <= (SELECT COUNT(*) FROM @values_table)
BEGIN
    SET @output_string = @output_string + (
        SELECT
            string_values
        FROM (
            SELECT
                string_values
                ,ROW_NUMBER() OVER (ORDER BY string_values) AS row_num
            FROM @values_table) sub_query
        WHERE row_num = @row_counter) + @delimiter
    SET @row_counter = @row_counter + 1
END

SELECT SUBSTRING(@output_string,0,LEN(@output_string)-2)

以下是UDF的TSQL,它接受一个输入字符串进行排序,并使用分隔符将其拆分。

CREATE FUNCTION udf_order_string(@input_string NVARCHAR(MAX), @delimiter NVARCHAR(MAX))
RETURNS NVARCHAR(MAX)
AS   

BEGIN

    DECLARE @output_string NVARCHAR(MAX) = ''

    DECLARE @values_table TABLE (
    string_values NVARCHAR(MAX)
    )

    WHILE (SELECT LEN(@input_string) - LEN(REPLACE(@input_string,@delimiter,''))) > 0
    BEGIN
        INSERT @values_table
        SELECT SUBSTRING(@input_string,0,CHARINDEX(', ',@input_string))

        SET @input_string = SUBSTRING(@input_string,CHARINDEX(@delimiter,@input_string)+2,LEN(@input_string))
    END

    INSERT @values_table
    SELECT @input_string

    DECLARE @row_counter INT = 1

    WHILE @row_counter <= (SELECT COUNT(*) FROM @values_table)
    BEGIN
        SET @output_string = @output_string + (
            SELECT
                string_values
            FROM (
                SELECT
                    string_values
                    ,ROW_NUMBER() OVER (ORDER BY string_values) AS row_num
                FROM @values_table) sub_query
            WHERE row_num = @row_counter) + @delimiter
        SET @row_counter = @row_counter + 1
    END

    SET @output_string = SUBSTRING(@output_string,0,LEN(@output_string)-2)

    RETURN @output_string

END