我正在尝试创建一个SSRS报告,该报告具有可以按月,每季度或每年分组的数据矩阵。我能够每月正确地对数据进行分组,但在尝试按其他任何方式对其进行分组时会遇到问题。
以下是一个示例数据集:
Account # BillingDate DateActivated Balance
1 1/1/16 1/1/16 $10,000
1 2/1/16 1/1/16 $9,000
1 3/1/16 1/1/16 $9,500
1 4/1/16 1/1/16 $7,000
1 5/1/16 1/1/16 $4,000
1 6/1/16 1/1/16 $1,000
当我按季度分组时,我只想要本季度数据的最后一个月。例如,对于Q1,我希望获得9,500美元的余额并忽略10,000美元和9,000美元的余额。但是,我的分组总结了他们,给了我28,500美元。
期望的结果
月报:
DateActivated 1/1/16
BillingDate 1/1/6 $10,000
BillingDate 2/1/6 $9,000
BillingDate 3/1/6 $9,500
BillingDate 4/1/6 $7,000
BillingDate 5/1/6 $4,000
BillingDate 6/1/6 $1,500
季度报告:
DateActivated Q1
BillingDate Q1 $9,500
BillingDate Q2 $1,000
我一直试图使用子查询,但还没有开始工作。
编辑:我使用简单的查询来获得上述结果:
SELECT AccountNumber, BillingDate, DateActivated, Balance
FROM TestTable
答案 0 :(得分:0)
这不是一个简单的公式,如:
=sum(switch(month(Fields!BillingDate.value) = 3 ,Balance ,
month(Fields!BillingDate.value) = 6 ,Balance ,
month(Fields!BillingDate.value) = 9 ,Balance ,
month(Fields!BillingDate.value) = 12 ,Balance,
month(Fields!BillingDate.value) = month(@ParameterThruDate),Balance))
和矩阵组
DatePart(DateInterval.Quarter,Fields.BillingDate.value)
答案 1 :(得分:0)
创建两个矩阵,如下所示:
每月报告:
季度报告:
可以使用以下表达式计算Quarter行组:
Database View
要使用季度:
=DatePart(DateInterval.Quarter,Fields!BillingDate.Value)
要使用最后一个余额值:
="BillingDate Q" & DatePart(DateInterval.Quarter,Fields!BillingDate.Value)
还考虑按Account创建父行组。
结果如下:
我创建了一个虚拟数据集,其中包含Q4的不完整数据(没有数据在12月和12月)。如果11月或12月不存在,它会显示octuber数据。
如果有帮助,请告诉我。
答案 2 :(得分:0)
在我看来,最好让sql做繁重的工作并保持SSRS RDL非常简单。我会更新您的查询,只根据@period_type参数返回您需要的记录。此示例假定您的数据已按照示例数据显示每月进行分组。如果不是这种情况,请告诉我,我可以更新此示例:
if @period_type = 1 -- monthly
select
AccountNumber,
-- convert BillingDate to text so the data type matches the Quarter strings
convert(varchar(10),BillingDate,101) as BillingDate
DateActivated,
Balance
from TestTable
if @period_type = 2 -- quarterly
select
AccountNumber,
BillingDate
DateActivated,
Balance
from (
select
AccountNumber,
'Q' + cast(datepart(quarter,BillingDate) as char(1)) as BillingDate
DateActivated,
Balance,
row_number() over(partition by datepart(quarter,BillingDate)
order by BillingDate desc) keep_this_1
from TestTable
) tt
where keep_this_1 = 1