【问题标题】:Adding columns average and total添加列平均值和总计
【发布时间】:2018-06-07 08:47:44
【问题描述】:

我在下面有这个查询:

SELECT distinct COUNT(Status) AS [Transactions], sender AS [Supplier],
left(DATENAME(mm, Date_Reported), 3) AS Month, DATENAME(yyyy, Date_Reported) AS Year
 FROM TX
 where Date_Reported >= DATEADD(MONTH, -13, CAST(GETDATE() AS DATE))
GROUP BY DATENAME(mm, Date_Reported), DATENAME(yyyy, Date_Reported), sender
ORDER BY sender, Year, Month DESC;

它给了我一个如下表:

TX | Supplier | Month | Year

我想多加两列:过去 13 个月的平均值(即 5 月 17 日 - 5 月 18 日)以及过去 13 个月的总数,所以最终表格应如下所示:

Supplier | May 17 | Jun 17 | Jul 17 ... | May 18 | Average | Total

有什么想法可以通过一个大型查询来实现这一点吗?

【问题讨论】:

  • 该查询无法编译,您在 FROM TX 之后缺少一个 WHERE 谓词。
  • 抱歉现在编辑了
  • OK - 还有一个问题:您将如何呈现这些数据,例如 SSRS/Power BI?例如,如果您使用的是 SSRS,我会将月份和年份连接到一个新字段中并对其进行列分组,然后计算 SSRS 中的平均值和总计。
  • 是 ssrs- 使用 Visual Studio 构建报表
  • 请看我的回答。

标签: sql-server average


【解决方案1】:

首先,修改您的 SQL 查询以在 SSRS 中执行该连接。您也可以在 SSRS 中执行此操作,但我更喜欢在 SQL 中执行此操作。另外,我已经删除了您在别名中使用保留字(这是不好的做法):

with cte
    (Transactions, Supplier, CalendarMonth, CalendarYear)
as (
       select distinct
              count([Status])
            , sender
            , left(datename(mm, Date_Reported), 3)
            , right(datename(yyyy, Date_Reported), 2)
       from TX
       where
           Date_Reported between
                                 dateadd(
                                       month
                                     , -13
                                     , cast(dateadd(month, DATEDIFF(month, -1, getdate()) - 2, 0) as date)
                                   )
                        and  cast(dateadd(ss, -1, DATEADD(month, DATEDIFF(month, 0, getdate()), 0)) as date)
       group by
           datename(mm, Date_Reported)
         , datename(yyyy, Date_Reported)
         , sender
   )
select Supplier
     , Transactions
     , CalendarMonth
     , CalendarYear
     , concat(CalendarMonth, ' ', CalendarYear) as ReportedMonth
from cte
order by
    CalendarYear
  , CalendarMonth asc;

在 SSRS 中,您需要将此查询用作数据集源:

然后,您需要按照以下设计创建一个 maxtrix。注意 ReportedMonth 上的列分组:

“平均”和“总计”列应在列分组之外创建。以下是它们的表达式,因此您正在计算 SSRS 中的平均值/总数:

让我知道这是怎么回事。 SQL 解决方案的问题在于您必须使用pivot,这意味着您必须将月份值硬编码到pivot 中,或者使用动态sql 生成数据透视表(不推荐)。这使 SQL 和 SSRS 中的操作更加简单,并且您的报告将在过去 13 个月内动态保持最新状态。

让我知道你过得怎么样。另外,请用 ssrs 标记这个问题。

PS:您确定要使用来自getdate() 的过去 13 个月的滚动平均值吗?当你在这个月的中途时,你会得到一些非常时髦的平均值。考虑将您的 sql 修改为过去 13 个整月的平均值。

【讨论】:

  • 太棒了!是的,每个新月我都希望平均值超过新的 13 个月,而不是滚动平均值
  • 我已经修改了我的答案来做到这一点。这是从上个月到上个月最后一天的 13 个月后的第一天的between
  • 你是救命稻草,非常感谢你的帮助:)
猜你喜欢
  • 1970-01-01
  • 2021-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多