添加列平均值和总数

时间:2018-06-07 08:47:44

标签: sql-server average

我在下面有这个查询:

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

我是如何通过一个大型查询来实现这一目标的?

1 个答案:

答案 0 :(得分:0)

首先,修改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中,您需要将此查询用作数据集源:

enter image description here

然后,您需要根据以下设计创建maxtrix。请注意ReportedMonth上的列分组: enter image description here

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

enter image description here

enter image description here

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

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

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