2017-04-05 128 views
0

一个逗号分隔的列表中的数据进行排序我有,我有COALESCE关键字做类似下面的电池用逗号分隔的列表:如何在SSRS报告

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 

我怎样才能对此列表进行排序?

谢谢

+0

你是什么意思排序列表? – LONG

+0

因此,房地产经纪商交易返回如下数据: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。我希望能够按字母顺序排序。 –

+0

所以@RelatorFirmDeals是一个表变量?你的表变量结构是什么? – LONG

回答

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

希望这有助于出去。

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) 

这里是TSQL用于UDF该需要进行排序的输入字符串和一个分隔符分割它。

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