在 SSRS 中按顺序对数字列进行排序

Sorting Number Columns in Order In SSRS

我正在使用 Microsoft SQL Server 2012 和 Visual Studio 2012。在我的 SQL 代码中,我开发了一个 AgeBucket 列,它基本上会计算一个请求的开始日期和结束日期。我的代码如下(我提前为它的长代码道歉。)

它有效,当我尝试将它放入我的 SSRS 报告的数据集中时,它也有效,但对于列,数字显示乱序。它显示 6-10 作为最后一列,所有其他列在按 AgeBucket 分组时似乎都是有序的。我意识到 SSRS 可能会查看每列的第一个数字,这就是为什么 6-10 在排序中排在最后。

我的问题是,如何在 SSRS 中对这些数字进行排序?我的 ColumnGroups 中有 AgeBucket 列,但不确定按顺序获取正确列中信息的最佳排序方式。

         CASE WHEN 
            CASE WHEN A.[EndDate] > A.[StartDate] THEN C2.[BusinessCalendarDay] - C1.[BusinessCalendarDay]  
                 WHEN A.[EndDate] IS NULL and A.[StartDate] IS NOT NULL THEN C3.[BusinessCalendarDay] - C1.[BusinessCalendarDay]
                 WHEN A.[EndDate] = A.[StartDate] THEN 1
         END BETWEEN 0 AND 6
         THEN '0-5'
         WHEN 
            CASE WHEN A.[EndDate] > A.[StartDate] THEN C2.[BusinessCalendarDay] - C1.[BusinessCalendarDay]  
                 WHEN A.[EndDate] IS NULL and A.[StartDate] IS NOT NULL THEN C3.[BusinessCalendarDay] - C1.[BusinessCalendarDay]
                 WHEN A.[EndDate] = A.[StartDate] THEN 1
         END BETWEEN 6 AND 10
         THEN '6-10'
         WHEN
            CASE WHEN A.[EndDate] > A.[StartDate] THEN C2.[BusinessCalendarDay] - C1.[BusinessCalendarDay]  
                 WHEN A.[EndDate] IS NULL and A.[StartDate] IS NOT NULL THEN C3.[BusinessCalendarDay] - C1.[BusinessCalendarDay]
                 WHEN A.[EndDate] = A.[StartDate] THEN 1
         END BETWEEN 11 AND 15
         THEN '11-15'
         WHEN
            CASE WHEN A.[EndDate] > A.[StartDate] THEN C2.[BusinessCalendarDay] - C1.[BusinessCalendarDay]  
                 WHEN A.[EndDate] IS NULL and A.[StartDate] IS NOT NULL THEN C3.[BusinessCalendarDay] - C1.[BusinessCalendarDay]
                 WHEN A.[EndDate] = A.[StartDate] THEN 1
         END BETWEEN 16 AND 20
         THEN '16-20'
         WHEN
            CASE WHEN A.[EndDate] > A.[StartDate] THEN C2.[BusinessCalendarDay] - C1.[BusinessCalendarDay]  
                 WHEN A.[EndDate] IS NULL and A.[StartDate] IS NOT NULL THEN C3.[BusinessCalendarDay] - C1.[BusinessCalendarDay]
                 WHEN A.[EndDate] = A.[StartDate] THEN 1
         END BETWEEN 21 AND 25
         THEN '21-25'
         WHEN
            CASE WHEN A.[EndDate] > A.[StartDate] THEN C2.[BusinessCalendarDay] - C1.[BusinessCalendarDay]  
                 WHEN A.[EndDate] IS NULL and A.[StartDate] IS NOT NULL THEN C3.[BusinessCalendarDay] - C1.[BusinessCalendarDay]
                 WHEN A.[EndDate] = A.[StartDate] THEN 1
         END BETWEEN 26 AND 30
         THEN '26-30'
         WHEN
            CASE WHEN A.[EndDate] > A.[StartDate] THEN C2.[BusinessCalendarDay] - C1.[BusinessCalendarDay]  
                 WHEN A.[EndDate] IS NULL and A.[StartDate] IS NOT NULL THEN C3.[BusinessCalendarDay] - C1.[BusinessCalendarDay]
                 WHEN A.[EndDate] = A.[StartDate] THEN 1
         END BETWEEN 31 AND 35
         THEN '31-35'
         WHEN
            CASE WHEN A.[EndDate] > A.[StartDate] THEN C2.[BusinessCalendarDay] - C1.[BusinessCalendarDay]  
                 WHEN A.[EndDate] IS NULL and A.[StartDate] IS NOT NULL THEN C3.[BusinessCalendarDay] - C1.[BusinessCalendarDay]
                 WHEN A.[EndDate] = A.[StartDate] THEN 1
         END BETWEEN 35 AND 40
         THEN '35-40'
         WHEN
            CASE WHEN A.[EndDate] > A.[StartDate] THEN C2.[BusinessCalendarDay] - C1.[BusinessCalendarDay]  
                 WHEN A.[EndDate] IS NULL and A.[StartDate] IS NOT NULL THEN C3.[BusinessCalendarDay] - C1.[BusinessCalendarDay]
                 WHEN A.[EndDate] = A.[StartDate] THEN 1
         END > 40
         THEN '41+'
    END AS AgeBucket
    FROM CAST(A.StartDate AS DATE) = C1.[CAL_DT]        
    LEFT JOIN [dbo].[DT_DIM] AS C2 
    ON CAST(A.EndDate AS DATE) = C2.[CAL_DT]        
    LEFT JOIN [dbo].[DT_DIM] AS C3 
    ON CAST(GETDATE() AS DATE) = C3.[CAL_DT]

你有一些选择。

  1. 更改存储桶标签,以便它们按照您喜欢的方式排序。它们是文本,因此您可能需要添加前导零。

'0-5' 需要 '00-05''6-10' -> '06-10', 等等。不是很漂亮。

  1. 在查询中添加另一个字段,就像您为存储桶设置的字段一样,但使用数字而不是文本标签。使用这个新字段在报告中排序。

见下文。我是这样处理的。

    CASE WHEN 
            CASE WHEN A.[EndDate] > A.[StartDate] THEN C2.[BusinessCalendarDay] - C1.[BusinessCalendarDay]  
                 WHEN A.[EndDate] IS NULL and A.[StartDate] IS NOT NULL THEN C3.[BusinessCalendarDay] - C1.[BusinessCalendarDay]
                 WHEN A.[EndDate] = A.[StartDate] THEN 1
         END BETWEEN 0 AND 6
         THEN 10
         WHEN 
            CASE WHEN A.[EndDate] > A.[StartDate] THEN C2.[BusinessCalendarDay] - C1.[BusinessCalendarDay]  
                 WHEN A.[EndDate] IS NULL and A.[StartDate] IS NOT NULL THEN C3.[BusinessCalendarDay] - C1.[BusinessCalendarDay]
                 WHEN A.[EndDate] = A.[StartDate] THEN 1
         END BETWEEN 6 AND 10
         THEN 20
         WHEN
            CASE WHEN A.[EndDate] > A.[StartDate] THEN C2.[BusinessCalendarDay] - C1.[BusinessCalendarDay]  
                 WHEN A.[EndDate] IS NULL and A.[StartDate] IS NOT NULL THEN C3.[BusinessCalendarDay] - C1.[BusinessCalendarDay]
                 WHEN A.[EndDate] = A.[StartDate] THEN 1
         END BETWEEN 11 AND 15
         THEN 30
         WHEN
            CASE WHEN A.[EndDate] > A.[StartDate] THEN C2.[BusinessCalendarDay] - C1.[BusinessCalendarDay]  
                 WHEN A.[EndDate] IS NULL and A.[StartDate] IS NOT NULL THEN C3.[BusinessCalendarDay] - C1.[BusinessCalendarDay]
                 WHEN A.[EndDate] = A.[StartDate] THEN 1
         END BETWEEN 16 AND 20
         THEN 40
         WHEN
            CASE WHEN A.[EndDate] > A.[StartDate] THEN C2.[BusinessCalendarDay] - C1.[BusinessCalendarDay]  
                 WHEN A.[EndDate] IS NULL and A.[StartDate] IS NOT NULL THEN C3.[BusinessCalendarDay] - C1.[BusinessCalendarDay]
                 WHEN A.[EndDate] = A.[StartDate] THEN 1
         END BETWEEN 21 AND 25
         THEN 50
         WHEN
            CASE WHEN A.[EndDate] > A.[StartDate] THEN C2.[BusinessCalendarDay] - C1.[BusinessCalendarDay]  
                 WHEN A.[EndDate] IS NULL and A.[StartDate] IS NOT NULL THEN C3.[BusinessCalendarDay] - C1.[BusinessCalendarDay]
                 WHEN A.[EndDate] = A.[StartDate] THEN 1
         END BETWEEN 26 AND 30
         THEN 60
         WHEN
            CASE WHEN A.[EndDate] > A.[StartDate] THEN C2.[BusinessCalendarDay] - C1.[BusinessCalendarDay]  
                 WHEN A.[EndDate] IS NULL and A.[StartDate] IS NOT NULL THEN C3.[BusinessCalendarDay] - C1.[BusinessCalendarDay]
                 WHEN A.[EndDate] = A.[StartDate] THEN 1
         END BETWEEN 31 AND 35
         THEN 70
         WHEN
            CASE WHEN A.[EndDate] > A.[StartDate] THEN C2.[BusinessCalendarDay] - C1.[BusinessCalendarDay]  
                 WHEN A.[EndDate] IS NULL and A.[StartDate] IS NOT NULL THEN C3.[BusinessCalendarDay] - C1.[BusinessCalendarDay]
                 WHEN A.[EndDate] = A.[StartDate] THEN 1
         END BETWEEN 35 AND 40
         THEN 80
         WHEN
            CASE WHEN A.[EndDate] > A.[StartDate] THEN C2.[BusinessCalendarDay] - C1.[BusinessCalendarDay]  
                 WHEN A.[EndDate] IS NULL and A.[StartDate] IS NOT NULL THEN C3.[BusinessCalendarDay] - C1.[BusinessCalendarDay]
                 WHEN A.[EndDate] = A.[StartDate] THEN 1
         END > 40
         THEN 100
    END AS OrderBy

使用新的 OrderBy 列在 RDL 中排序。

  1. 将当前查询包装在 SELECT 语句中,并通过计算 AgeBucket 的值并设置正确的排序顺序来添加用于排序的新列。像上面一样使用新列在 RDL 中进行排序。

见下文。

SELECT AA.*, CASE WHEN AA.AgeBucket = '0-5' THEN 10
WHEN AA.AgeBucket = '6-10' THEN 20
...
ELSE 100 END AS OrderBy
FROM (SELECT ...,
CASE WHEN 
    CASE WHEN A.[EndDate] > A.[StartDate] THEN C2.[BusinessCalendarDay] - C1.[BusinessCalendarDay]  
            WHEN A.[EndDate] IS NULL and A.[StartDate] IS NOT NULL THEN C3.[BusinessCalendarDay] - C1.[BusinessCalendarDay]
            WHEN A.[EndDate] = A.[StartDate] THEN 1
    END BETWEEN 0 AND 6
    THEN '0-5'
    WHEN 
    CASE WHEN A.[EndDate] > A.[StartDate] THEN C2.[BusinessCalendarDay] - C1.[BusinessCalendarDay]  
            WHEN A.[EndDate] IS NULL and A.[StartDate] IS NOT NULL THEN C3.[BusinessCalendarDay] - C1.[BusinessCalendarDay]
            WHEN A.[EndDate] = A.[StartDate] THEN 1
    END BETWEEN 6 AND 10
    THEN '6-10'
    ...
    THEN '41+'
END AS AgeBucket
...) AA -- End of wrapping SELECT

祝你好运!

你是对的 - 它按第一个字符排序,因为你的字段是文本字段。

我只想在 SSRS 中您的组的 SORT 中使用 IIF 语句:

=IIF(Fields!AgeBucket.Value = "0-5",   1, 
 IIF(Fields!AgeBucket.Value = "6-10",  2, 
 IIF(Fields!AgeBucket.Value = "11-15", 3, 
 IIF(Fields!AgeBucket.Value = "16-20", 4, 
 IIF(Fields!AgeBucket.Value = "21-25", 5, 
 IIF(Fields!AgeBucket.Value = "26-30", 6, 
 IIF(Fields!AgeBucket.Value = "31-35", 7, 
 IIF(Fields!AgeBucket.Value = "36-40", 8, 
 IIF(Fields!AgeBucket.Value = "41+", 9, 10)