如何以正确的月份顺序显示最后滚动的 12 个月
How to Display Last rolling 12 months in correct month order
我有一份显示当年客户销售额的 SSRS 报告,我被要求将其更改为最近 13 个滚动月。我已将我的 where 子句更改为:
WHERE (#First12Months.FirstSaleDate BETWEEN DATEADD(MM,-13,@ReportDate) AND (@ReportDate))
(@ReportDate是矩阵右边需要显示的月份的最后一天。)
这个 where 子句提取了正确的数据,但它仍然显示在我的 monthsort 顺序中,我需要将其更改为最近 12 个月,以便最新的月份在右边,最早的月份在左边。我无法弄清楚如何进行排序。
我的旧排序是 MonthSort,它给每个月一个数字,其中 April 是 1 到 March = 12:
CASE WHEN Month(#First12Months.FirstSaleDate)<=3 THEN MONTH(#First12Months.FirstSaleDate)+9 ELSE MONTH(#First12Months.FirstSaleDate)-3 END AS MonthSort
但是现在这当然是不正确的,因为我需要从@ReportDate 开始的月份是第 13 个,并且按时间顺序在那个月之前的每个月都少 1 个数字。
我发现这个 post 这是唯一一个似乎接近我需要的东西,但不幸的是我根本不明白它在说什么。
如何告诉 MonthSort 列将哪个数字分配给月份以获得连续 13 个月的正确排序顺序?
我想,您检索数据的第一个查询是正确的。必须在 SSRS 报告中更改列的顺序。
要对 tablix(SSRS 中的 table 个元素)进行排序,请查看 here
由于您的数据以行显示,而您的 SSRS 以列显示,您可以执行以下操作:
向使用 analytical function 的 sql 查询添加一个排序列,以便给出月份的(密集)排名。然后可以将该排名用作 SSRS 中的排序标准。
假设您的月份列名为 month
,您的查询可能如下所示:
select t.*, dense_rank() over (order by month) rnk from t
这个顺序也可以这样降序排列:
select t.*, dense_rank() over (order by month desc) rnk from t
举个例子:
with t as (
select 2134 sales, cast('20190101' as date) month union all
select 3456 sales, cast('20190201' as date) month union all
select 234 sales, cast('20190301' as date) month union all
select 4567 sales, cast('20190401' as date) month union all
select 5678 sales, cast('20190501' as date) month union all
select 234 sales, cast('20190601' as date) month union all
select 756 sales, cast('20190701' as date) month union all
select 9 sales, cast('20190801' as date) month union all
select 24356134 sales, cast('20190901' as date) month union all
select 2456134 sales, cast('20191001' as date) month union all
select 234 sales, cast('20191101' as date) month union all
select 675 sales, cast('20191201' as date) month union all
select 86 sales, cast('20200101' as date) month union all
select 786 sales, cast('20200201' as date) month union all
select 715 sales, cast('20200301' as date) month union all
select 156 sales, cast('20200401' as date) month union all
select 123 sales, cast('20200501' as date) month union all
select 687 sales, cast('20200601' as date) month union all
select 45 sales, cast('20200701' as date) month
)
, t1 as (
select sales, month from t where t.month > dateadd(MONTH, -12, getdate())
)
select t1.*, DENSE_RANK() over (order by datefromparts(year(month), month([month]), 1)) rnk from t1
将return
发布我自己的答案:
我设法计算出一个公式来计算每列的位置编号以替换我的 MonthSort 列:
select case when MONTH(saledate) BETWEEN MONTH(dateadd(mm,-11,@ReportDate)) AND 12 THEN((MONTH(saledate)+1)-MONTH(@ReportDate)+11) ELSE ((month(saledate)+1)+month(@ReportDate)+11) end as position,
from table
WHERE (saledate BETWEEN DATEADD(MM,-11,@ReportDate) AND (@ReportDate))
这并不能完全满足我的要求,因为我想要 12 个月但不知道如何区分今年的同月和去年的同月,例如如果报告日期是 2020 年 6 月 30 日,则使用 12 个月参数给出 6 月 2 个月(2019 年和 2020 年每年 1 个月),但将它们都放在位置 1,此时 2019 年 6 月应位于位置 1,而 2020 年 6 月应排在第 13 位。适用于 11 个月。如果有人可以帮助它达到 12 个月,我将不胜感激
我发布了我自己的另一个答案,因为这是实现我所需要的以及最简单的方法的不同方式 - 我使这个问题比它需要的复杂得多。
在我的第二次努力中,我使用 YEAR(SaleDate) 添加了一个名为 SaleYear 的额外列。我已经有一个 MONTH(SaleDate) 列,我在实现 Apr 到 March 排序的情况下使用它。
我使用 where 子句将 SQL 查询中的数据限制为过去 13 个月:
WHERE (SaleDate BETWEEN DATEADD(MM,-13,@ReportDate) AND DATEADD(minute, - 1, @ReportDate + 1))
并且在 SSRS 报告中,我将 'Year' 作为父列组添加到 'Month' 列组。在列组中,我添加了按年排序,然后按月排序。
因为我已经将 sql 查询中的数据限制为过去 13 个月的数据,所以我有最后 13 个滚动月份的正确顺序。
这是最干净、最简单的答案。
我有一份显示当年客户销售额的 SSRS 报告,我被要求将其更改为最近 13 个滚动月。我已将我的 where 子句更改为:
WHERE (#First12Months.FirstSaleDate BETWEEN DATEADD(MM,-13,@ReportDate) AND (@ReportDate))
(@ReportDate是矩阵右边需要显示的月份的最后一天。)
这个 where 子句提取了正确的数据,但它仍然显示在我的 monthsort 顺序中,我需要将其更改为最近 12 个月,以便最新的月份在右边,最早的月份在左边。我无法弄清楚如何进行排序。 我的旧排序是 MonthSort,它给每个月一个数字,其中 April 是 1 到 March = 12:
CASE WHEN Month(#First12Months.FirstSaleDate)<=3 THEN MONTH(#First12Months.FirstSaleDate)+9 ELSE MONTH(#First12Months.FirstSaleDate)-3 END AS MonthSort
但是现在这当然是不正确的,因为我需要从@ReportDate 开始的月份是第 13 个,并且按时间顺序在那个月之前的每个月都少 1 个数字。
我发现这个 post 这是唯一一个似乎接近我需要的东西,但不幸的是我根本不明白它在说什么。
如何告诉 MonthSort 列将哪个数字分配给月份以获得连续 13 个月的正确排序顺序?
我想,您检索数据的第一个查询是正确的。必须在 SSRS 报告中更改列的顺序。 要对 tablix(SSRS 中的 table 个元素)进行排序,请查看 here
由于您的数据以行显示,而您的 SSRS 以列显示,您可以执行以下操作: 向使用 analytical function 的 sql 查询添加一个排序列,以便给出月份的(密集)排名。然后可以将该排名用作 SSRS 中的排序标准。
假设您的月份列名为 month
,您的查询可能如下所示:
select t.*, dense_rank() over (order by month) rnk from t
这个顺序也可以这样降序排列:
select t.*, dense_rank() over (order by month desc) rnk from t
举个例子:
with t as (
select 2134 sales, cast('20190101' as date) month union all
select 3456 sales, cast('20190201' as date) month union all
select 234 sales, cast('20190301' as date) month union all
select 4567 sales, cast('20190401' as date) month union all
select 5678 sales, cast('20190501' as date) month union all
select 234 sales, cast('20190601' as date) month union all
select 756 sales, cast('20190701' as date) month union all
select 9 sales, cast('20190801' as date) month union all
select 24356134 sales, cast('20190901' as date) month union all
select 2456134 sales, cast('20191001' as date) month union all
select 234 sales, cast('20191101' as date) month union all
select 675 sales, cast('20191201' as date) month union all
select 86 sales, cast('20200101' as date) month union all
select 786 sales, cast('20200201' as date) month union all
select 715 sales, cast('20200301' as date) month union all
select 156 sales, cast('20200401' as date) month union all
select 123 sales, cast('20200501' as date) month union all
select 687 sales, cast('20200601' as date) month union all
select 45 sales, cast('20200701' as date) month
)
, t1 as (
select sales, month from t where t.month > dateadd(MONTH, -12, getdate())
)
select t1.*, DENSE_RANK() over (order by datefromparts(year(month), month([month]), 1)) rnk from t1
将return
发布我自己的答案: 我设法计算出一个公式来计算每列的位置编号以替换我的 MonthSort 列:
select case when MONTH(saledate) BETWEEN MONTH(dateadd(mm,-11,@ReportDate)) AND 12 THEN((MONTH(saledate)+1)-MONTH(@ReportDate)+11) ELSE ((month(saledate)+1)+month(@ReportDate)+11) end as position,
from table
WHERE (saledate BETWEEN DATEADD(MM,-11,@ReportDate) AND (@ReportDate))
这并不能完全满足我的要求,因为我想要 12 个月但不知道如何区分今年的同月和去年的同月,例如如果报告日期是 2020 年 6 月 30 日,则使用 12 个月参数给出 6 月 2 个月(2019 年和 2020 年每年 1 个月),但将它们都放在位置 1,此时 2019 年 6 月应位于位置 1,而 2020 年 6 月应排在第 13 位。适用于 11 个月。如果有人可以帮助它达到 12 个月,我将不胜感激
我发布了我自己的另一个答案,因为这是实现我所需要的以及最简单的方法的不同方式 - 我使这个问题比它需要的复杂得多。 在我的第二次努力中,我使用 YEAR(SaleDate) 添加了一个名为 SaleYear 的额外列。我已经有一个 MONTH(SaleDate) 列,我在实现 Apr 到 March 排序的情况下使用它。 我使用 where 子句将 SQL 查询中的数据限制为过去 13 个月:
WHERE (SaleDate BETWEEN DATEADD(MM,-13,@ReportDate) AND DATEADD(minute, - 1, @ReportDate + 1))
并且在 SSRS 报告中,我将 'Year' 作为父列组添加到 'Month' 列组。在列组中,我添加了按年排序,然后按月排序。 因为我已经将 sql 查询中的数据限制为过去 13 个月的数据,所以我有最后 13 个滚动月份的正确顺序。
这是最干净、最简单的答案。