在 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]
你有一些选择。
- 更改存储桶标签,以便它们按照您喜欢的方式排序。它们是文本,因此您可能需要添加前导零。
'0-5'
需要 '00-05'
; '6-10'
-> '06-10'
, 等等。不是很漂亮。
- 在查询中添加另一个字段,就像您为存储桶设置的字段一样,但使用数字而不是文本标签。使用这个新字段在报告中排序。
见下文。我是这样处理的。
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 中排序。
- 将当前查询包装在
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)
我正在使用 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]
你有一些选择。
- 更改存储桶标签,以便它们按照您喜欢的方式排序。它们是文本,因此您可能需要添加前导零。
'0-5'
需要 '00-05'
; '6-10'
-> '06-10'
, 等等。不是很漂亮。
- 在查询中添加另一个字段,就像您为存储桶设置的字段一样,但使用数字而不是文本标签。使用这个新字段在报告中排序。
见下文。我是这样处理的。
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 中排序。
- 将当前查询包装在
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)