我在下面有这个查询:
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
我是如何通过一个大型查询来实现这一目标的?
答案 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中,您需要将此查询用作数据集源:
然后,您需要根据以下设计创建maxtrix。请注意ReportedMonth上的列分组:
应在列分组之外创建“平均”和“总计”列。下面是它们的表达式,因此您要计算SSRS中的平均值/总数:
让我知道这是怎么回事。 SQL解决方案的问题在于您必须使用pivot
,这意味着您必须将月份值硬编码到pivot
中,或者使用动态SQL生成数据透视表(不推荐)。这使得SQL和SSRS中的操作更加简单,并且您的报告将在过去13个月内保持最新状态。
让我知道你是怎么过的。另外,请用ssrs标记这个问题。
PS:您确定要使用getdate()
过去13个月的滚动平均值吗?当你在这个月中途时,你会得到一些非常时髦的平均值。考虑修改你的sql以平均过去整整13个月。