【问题标题】:How to Display Last rolling 12 months in correct month order如何以正确的月份顺序显示最后滚动的 12 个月
【发布时间】:2020-07-02 14:02:45
【问题描述】:

我有一份 SSRS 报告,其中显示了该年度的客户销售额,我被要求将其更改为过去 13 个滚动月份。我已将 where 子句更改为:

WHERE (#First12Months.FirstSaleDate BETWEEN DATEADD(MM,-13,@ReportDate) AND (@ReportDate))

(@ReportDate 是需要在矩阵右侧显示的月份的最后一天。)

这个 where 子句提取了正确的数据,但它仍然显示在我的月份排序顺序中,我需要将其更改为过去 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 号。

我发现这篇文章似乎是唯一接近我需要的帖子,但不幸的是我根本不明白它在说什么。

Dynamic table/output each month for report

如何告诉 MonthSort 列将哪个数字分配给月份以获得滚动 13 个月的正确排序顺序?

【问题讨论】:

    标签: tsql ssrs-2008-r2 columnsorting


    【解决方案1】:

    由于您的数据在行中并且您的 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
    

    将返回

    【讨论】:

    • 谢谢@casenonsensitive,这是一个非常有用的链接,但不幸的是我不知道如何告诉它每个月从哪里开始以考虑滚动月份的变化
    • dense_rank 会返回从 1 开始的数字。假设有 12 个不同的月份,dense_rank 将返回 1 到 12,具体取决于月份的顺序。
    • 也许我在这里真的很厚@casenonsensitive,但我仍然不明白如何使用'dense_rank() over'来每次在不同的月份开始排名。感谢您的帮助,很抱歉我无法遵循推理。
    • 谢谢,我现在明白了——它使用数据集中数据中的月份和年份,并按月份和年份对其进行排名,使其具有动态性。然后可以使用 rnk 号对列组进行排序
    • 感谢您的所有帮助。我仍然无法让 DENSE_RANK() over(按月排序)按销售日期的月份正确排名。这可能是我缺乏经验的表现(它每天都在排名)。我已经没时间了,因此将我自己的答案标记为对我有用的正确答案,但是对于其他阅读这篇文章的人来说,这也可能是正确答案。
    【解决方案2】:

    我猜,您检索数据的第一个查询是正确的。必须在 SSRS 报告中更改列的顺序。 要对 tablix(SSRS 中的表格元素)进行排序,请查看 here

    【讨论】:

    • 感谢您抽出宝贵时间回答,但在问题中您会看到我已经知道如何进行正常的列排序并且已经使用了上面详述的方法。我只需要一些帮助来确定如何分配要在我想象的 SQL 中排序的数字。或者我需要有人用更简单的方式解释我在问题中链接的帖子。
    • 假设您的表包含一个月的销售额,您可以使用 sql server 上的分析函数来获取您将在 SSRS 中使用的排序列。下面是一个例子: select month, DENSE_RANK() over (order by month) dr from t 查看docs.microsoft.com/en-us/sql/t-sql/queries/… 了解有关 sql server 的详细信息。
    • 谢谢@casenonsensitive-您能否将您的最后回复作为我原始评论的单独答案发布,以便如果证明是答案,我可以将其标记为正确-标记是不对的您的原始评论正确
    【解决方案3】:

    发表我自己的答案: 我设法制定了一个公式,计算每列的位置编号以替换我的 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 个月参数,它给出 2 个 6 月(2019 年和 2020 年每年 1 个),但是当 2019 年 6 月应该在第 1 位和 2020 年 6 月应该时,它们都位于第 1 位处于第 13 位。在 11 个月内运行良好。如果有人能帮我把它延长到 12 个月,我将不胜感激

    【讨论】:

    • 对于我的特定问题,这是最好的答案,尽管@casenonsensitive 的回复非常有帮助,但在这种情况下,我无法让它按我的意愿工作。
    • @casenonsensitive 已调整答案,因此现在是对我的查询的最佳回复
    【解决方案4】:

    我发布了我自己的另一个答案,因为它是实现我所需要的和最简单的不同方式 - 我让这个问题比它需要的复杂得多。 在我的第二次尝试中,我添加了一个名为 SaleYear 的额外列,使用:YEAR(SaleDate)。我已经有一个用于 MONTH(SaleDate) 的列,用于实现四月到三月的排序。 我使用 where 子句将 SQL 查询中的数据限制在过去 13 个月内:

    WHERE (SaleDate BETWEEN DATEADD(MM,-13,@ReportDate) AND DATEADD(minute, - 1, @ReportDate + 1))
    

    在 SSRS 报告中,我将“年”作为父列组添加到“月”列组中。在列组中,我添加了按年排序,然后按月排序。 因为我已经将 sql 查询中的数据限制为过去 13 个月,所以我有最后 13 个滚动月份的正确顺序。

    这是最简洁、最简单的答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-10
      相关资源
      最近更新 更多