簡體   English   中英

我有一個數據類型為nvarchar的列,我想按升序對其進行排序。 如何在SSRS中實現?

[英]I have a column with datatype nvarchar and I want to sort it in ascending order. How do I achieve it in SSRS?

這就是我得到的

  • abc 1
  • abc 12
  • abc 15
  • abc 2
  • abc 3

這就是我想要的

  • abc 1
  • abc 2
  • abc 3
  • abc 12
  • abc 15

我使用的查詢:

select *
from view_abc
order by col1

使用函數可以去除非數字字符並僅保留值。 使用另一個功能可以去除所有數字數據。 然后,您可以對兩個返回值進行排序。

一開始似乎有點工作,但是一旦功能啟用,您就可以在將來重新使用它們。 當我們從外部來源獲取數據時,這是我經常使用的兩個函數,但這些函數不是很規范。

它們可能不是世界上最有效的功能,但它們可以滿足我的目的

第一個功能只是保留數字部分。

CREATE FUNCTION [fn].[StripToAlpha]
(
@inputString nvarchar(4000)
)  
RETURNS varchar(4000)
AS  
BEGIN 

    DECLARE @Counter as int
    DECLARE @strReturnVal varchar(4000)
    DECLARE @Len as int
    DECLARE @ASCII as int

    SET @Counter=0  
    SET @Len=LEN(@inputString)

    SET @strReturnVal = ''

    WHILE @Counter<=@Len
    BEGIN
        SET @Counter = @Counter +1

        SET @ascii= ASCII(SUBSTRING(@inputString,@counter,1))

        IF(@ascii BETWEEN 65 AND 90) OR (@ascii BETWEEN 97 AND 122) 
        BEGIN
            SET @strReturnVal = @strReturnVal + (SUBSTRING(@inputString,@counter,1))
        END
    END

    RETURN @strReturnVal

END

第二個從文本字段中提取值的函數它也可以處理百分比(例如abc 23%表示為0.23),但是在您的情況下不是必需的。

您需要先創建一個'fn'模式,以更改模式名稱...

CREATE FUNCTION [fn].[ConvertToValue]
(
@inputString nvarchar(4000)
)  
RETURNS Float
AS  
BEGIN 

    DECLARE @Counter as int
    DECLARE @strReturnVal varchar(4000)
    DECLARE @ReturnVal Float
    DECLARE @Len as int
    DECLARE @ASCII as int

    SET @Counter=0  
    SET @Len=LEN(@inputString)

    SET @strReturnVal = ''

    IF @inputString IS NULL
        BEGIN
            Return NULL
        END

    IF @Len = 0 OR LEN(LTRIM(RTRIM(@inputString))) = 0 
        BEGIN
            SET @ReturnVal=0
        END
    ELSE
        BEGIN
            WHILE @Counter<=@Len
            BEGIN
                SET @Counter = @Counter +1

                SET @ascii= ASCII(SUBSTRING(@inputString,@counter,1))

                IF(@ascii BETWEEN 48 AND 57) OR (@ascii IN (46,37)) 
                BEGIN
                    SET @strReturnVal = @strReturnVal + (SUBSTRING(@inputString,@counter,1))
                END
            END

            if RIGHT(@strReturnVal,1)='%'
                BEGIN
                    SET @strReturnVal = LEFT(@strReturnVal,len(@strReturnVal)-1)
                    SET @strReturnVal = CAST((CAST(@strReturnVal AS FLOAT)/100) AS nvarchar(4000))
                END

            SET @ReturnVal = ISNULL(@strReturnVal,0)
        END

    RETURN @ReturnVal

END

現在我們已經創建了兩個函數,您只需執行

SELECT * 
FROM view_abc
ORDER BY fn.StripToAlpha(Col1), fn.ConvertToValue(Col1)

嘗試這個

編輯:

SELECT  CAST(SUBSTRING(ColumnNameToOrder,  CHARINDEX(' ', ColumnNameToOrder, 0), LEN (ColumnNameToOrder)) AS INT) AS IntColumn,   SUBSTRING(ColumnNameToOrder,0,  CHARINDEX(' ',  ColumnNameToOrder, 0)) AS CharColumn, * FROM view_abc ORDER BY Charcolumn, Intcolumn

您可以輸入包含諸如“ abc 123”之類的數據的列名,而不是ColumnNameToOrder。請告訴我它是否有效。

這就是我想出的。 也許它可以幫助您,或者至少為您指明正確的方向。

我測試了值。 當值的值為零時 ,順序就像您希望的順序一樣。 像這樣:

  • abc 01
  • abc 02
  • abc 03
  • abc 12
  • abc 15

因此,您可以運行此查詢以更新現有值,添加

UPDATE abc
SET col1 = 'abc 0' + SUBSTRING(col1, 5, 1)
WHERE LEN(col1) = 5

或者,如果前三個字符不同,則可以執行上述查詢:

UPDATE abc
SET col1 = (SUBSTRING(col1, 1, 3) + ' 0' + SUBSTRING(col1, 5, 1))
WHERE col1 LIKE 'abc__'

僅當當前String的長度為5時,這才會覆蓋col1列中的現有值。

然后,您可以運行以下查詢以獲取結果:

SELECT col1
FROM abc
ORDER BY col1 ASC
=cint(right(Fields!Col1.Value, instrrev(Fields!Col1.Value, " ")-1))

這將在SSRS中工作並正確排序,但是僅在Col1始終包含空格並且空格之后的字符可以轉換為整數的情況下才有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM