Sorting 按SSRS中的顺序对数字列进行排序
我正在使用Microsoft SQL Server 2012和Visual Studio 2012。在我的SQL代码中,我开发了一个列AgeBucket,它基本上会计算请求的开始日期和结束日期之间的天数。我的代码如下(我为它的长代码提前道歉。) 它是有效的,当我尝试将它放入我的SSRS报告的数据集中时,它也是有效的,但是对于列,数字出现了混乱。它显示6-10为最后一列,当按AgeBucket分组时,所有其他列似乎都是有序的。我意识到SSR可能会查看每列的第一个数字,这就是为什么在排序中最后抛出6-10 我的问题是,如何在SSR中对这些数字进行排序?我的ColumnGroups中有AgeBucket列,但不确定排序的最佳方式,以便按顺序获得正确列中的信息Sorting 按SSRS中的顺序对数字列进行排序,sorting,date,reporting-services,sql-server-2012,ssrs-2012,Sorting,Date,Reporting Services,Sql Server 2012,Ssrs 2012,我正在使用Microsoft SQL Server 2012和Visual Studio 2012。在我的SQL代码中,我开发了一个列AgeBucket,它基本上会计算请求的开始日期和结束日期之间的天数。我的代码如下(我为它的长代码提前道歉。) 它是有效的,当我尝试将它放入我的SSRS报告的数据集中时,它也是有效的,但是对于列,数字出现了混乱。它显示6-10为最后一列,当按AgeBucket分组时,所有其他列似乎都是有序的。我意识到SSR可能会查看每列的第一个数字,这就是为什么在排序中最后抛出6
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
祝你好运 你有一些选择
'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中你的小组的排序中使用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)
您是正确的-它是按第一个字符排序的,因为您的字段是文本字段 我只想在SSRS中你的小组的排序中使用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)
我不清楚你想要什么。只有一个正确的位置可以放置排序:最外面的
选择。在您的最终ORDER BY
中,允许使用给定的别名。另一种方法是将完整查询包装为CTE
,并按col1、col2、
从CTE顺序执行SELECT*。这同样适用于包装为sub-select的查询。你的意思是行
无序,而不是列
对吗?上面的代码更侧重于解释我如何创建我的AgeBucket字段。我的主要目标是,当我在SSRS中填充这个数据集字段时,当我按AgeBucket分组时,它并没有按顺序显示。最后出现的是“0-5”,“11-15”,“16-20”和“6-10”。但选中的答案解释了如何修复它,需要在SSRS列组类别中轻松排序。@搜索-不,列是无序的…不是行。我不清楚您想要什么。只有一个正确的位置可以放置排序:最外面的选择。在您的最终ORDER BY
中,允许使用给定的别名。另一种方法是将完整查询包装为CTE
,并按col1、col2、
从CTE顺序执行SELECT*。这同样适用于包装为sub-select的查询。你的意思是行
无序,而不是列
对吗?上面的代码更侧重于解释我如何创建我的AgeBucket字段。我的主要目标是,当我在SSRS中填充这个数据集字段时,当我按AgeBucket分组时,它并没有按顺序显示。最后出现的是“0-5”,“11-15”,“16-20”和“6-10”。但是检查过的答案解释了如何修复它,需要在SSRS列组类别中轻松排序。@搜索-不,列顺序错误…不是行。谢谢@Hannover,这正是我使用SSRS所需要的。谢谢你!谢谢@Hannover,这很有效,正是我使用SSRS所需要的。谢谢你!虽然这三种解决方案都有效,但在我的案例中,1和2没有必要有用#我很感谢你帮我回答。只检查上面的一个作为答案,因为它允许我在不操纵原始SQL代码的情况下简单地在SSR中排序。但是谢谢你,我感谢你的帮助!答案是一个很好的解决方案。我倾向于先修改SQL,因为我更像是一个数据库管理员。我想这一切都取决于你想在哪里改变,如果桶需要改变。。。RDL或SQL/存储过程。很乐意帮忙!虽然这三种解决方案都有效,但在我的案例中,1和2没有必要有用#我很感谢你帮我回答。只检查上面的一个作为答案,因为它允许我在不操纵原始SQL代码的情况下简单地在SSR中排序。但是谢谢你,我感谢你的帮助!答案是一个很好的解决方案。我倾向于首先修改SQL,因为我更像一个dat