【发布时间】:2016-10-27 20:56:15
【问题描述】:
我正在使用 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]
【问题讨论】:
-
对我来说还不清楚你想要什么。只有一个正确的地方可以放置排序:最外面的
SELECT。在您的最终ORDER BY中,允许使用给定的别名。另一种方法是将完整查询包装为CTE并执行SELECT * FROM CTE ORDER BY col1,col2,...。包装为子选择的查询也是如此。 -
您的意思是
rows出现故障而不是columns对吧? -
上面的代码只是更专注于解释我是如何创建我的 AgeBucket 字段的。我的主要目标是当我在 SSRS 中填充这个数据集字段时,当我按 AgeBucket 分组时它没有按顺序显示。它去了“0-5”、“11-15”、“16-20”……最后出现了“6-10”。但是检查的答案解释了如何修复它,需要在 SSRS 列组类别中轻松排序。
-
@Searching - 不,列乱序...不是行。
标签: sorting date reporting-services sql-server-2012 ssrs-2012