如何获得最后一个月';SQL Server中一个季度的数据是多少?
我正在尝试创建一个SSRS报告,其中包含一个数据矩阵,可以按月、每季度或每年分组。我可以每月对数据进行正确分组,但在尝试按任何其他方式分组时遇到问题 以下是一个示例数据集:如何获得最后一个月';SQL Server中一个季度的数据是多少?,sql,sql-server,reporting-services,Sql,Sql Server,Reporting Services,我正在尝试创建一个SSRS报告,其中包含一个数据矩阵,可以按月、每季度或每年分组。我可以每月对数据进行正确分组,但在尝试按任何其他方式分组时遇到问题 以下是一个示例数据集: Account # BillingDate DateActivated Balance 1 1/1/16 1/1/16 $10,000 1 2/1/16 1/1/16
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
当我按季度分组时,我只想要季度数据的最后一个月。例如,对于第一季度,我想要9500美元的余额,而忽略10000美元和9000美元的余额。然而,我的分组将它们全部汇总,并给我28500美元
预期结果 月报:
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
季度报告:
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
这不是一个简单的公式吗
=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)
这不是一个简单的公式吗
=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)
创建两个矩阵,如下所示: 月报: 季度报告: 可以使用以下表达式计算四分之一行组:
=DatePart(DateInterval.Quarter,Fields!BillingDate.Value)
要获得季度收益,请使用:
="BillingDate Q" & DatePart(DateInterval.Quarter,Fields!BillingDate.Value)
要获取最后一个余额值,请使用:
=SUM(
IIF(Fields!BillingDate.Value=MAX(Fields!BillingDate.Value),Fields!Balance.Value,0
))
也考虑按帐号创建父行组。 结果是:
我创建了一个第四季度数据不完整的虚拟数据集(11月和12月没有数据)。如果没有11月或12月,则显示octuber数据让我知道这是否有帮助。创建两个矩阵,如下所示: 月报: 季度报告: 可以使用以下表达式计算四分之一行组:
=DatePart(DateInterval.Quarter,Fields!BillingDate.Value)
要获得季度收益,请使用:
="BillingDate Q" & DatePart(DateInterval.Quarter,Fields!BillingDate.Value)
要获取最后一个余额值,请使用:
=SUM(
IIF(Fields!BillingDate.Value=MAX(Fields!BillingDate.Value),Fields!Balance.Value,0
))
也考虑按帐号创建父行组。 结果是:
我创建了一个第四季度数据不完整的虚拟数据集(11月和12月没有数据)。如果没有11月或12月,则显示octuber数据让我知道这是否有帮助。在我看来,最好让sql完成繁重的工作,并保持SSRS RDL非常简单。我会根据@period\u类型参数更新您的查询,只返回您需要的记录。本例假设您的数据已按示例数据所示每月分组。如果不是这样,请告诉我,我可以更新此示例:
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
在我看来,最好让sql完成繁重的工作,并保持SSRS RDL非常简单。我会根据@period\u类型参数更新您的查询,只返回您需要的记录。本例假设您的数据已按示例数据所示每月分组。如果不是这样,请告诉我,我可以更新此示例:
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
你不需要两排吗?一个来自2016年3月1日,另一个来自2016年6月1日?正确,对于季度示例,我省略了第二季度BillingDate行。我现在就编辑它。您能提供您当前正在使用的SQL查询吗?看起来你只需要按季度分组,其中月份是分组的最大值。你不需要两行吗?一个来自2016年3月1日,另一个来自2016年6月1日?正确,对于季度示例,我省略了第二季度BillingDate行。我现在就编辑它。您能提供您当前正在使用的SQL查询吗?似乎您只需要按季度分组,其中月份是组的最大值。我遇到了一个潜在问题,即第二个季度没有完整的季度(即最新的记录是11月,这意味着检查12月会给我空值),尽管我认为这可能行得通。数字看起来是正确的,只是需要处理一个不完整的季度。有什么想法吗?我编辑的公式应该适用于不完整的季度。您可以使用today()而不是参数。我遇到了一个潜在问题,即第二个季度没有完整的季度(即最新的记录是11月,这意味着检查12月会给我空值),尽管我认为这可能有效。数字看起来是正确的,只是需要处理一个不完整的季度。有什么想法吗?我编辑的公式应该适用于不完整的季度。您可以使用today()而不是parameter。最后一部分出现语法错误。我想我没有两个等号,可以吗?如果我在IIF之前删除等号,我会得到一个rsAggreateofAggregate错误。@ferensilver,是的,我错放了表达式。我上一季度没有得到任何结果。我不需要在帐户上分组。老实说,它也不需要出现在查询中。我放在那里只是为了帮助说明数据。@ferensilver,你的数据的最后一个季度是什么?其余季度的计算是否正确?每个结账日是否有多个余额值?我有不完整的第四季度数据(10月已完成,但11月和12月的数据不完整)。我有一个帐户每个结算日期的余额。我试图在一个简单的矩阵中重新创建上面的示例,以再现错误,但是我得到了聚合错误。有什么想法吗?最后一部分出现语法错误。我想我没有两个等号,可以吗?如果我在IIF之前删除等号,我会得到一个rsAggreateofAggregate错误。@ferensilver,是的,我错放了表达式。我上一季度没有得到任何结果。我不需要在帐户上分组。老实说,它也不需要出现在查询中。我放在那里只是为了帮助说明数据。@ferensilver,你的数据的最后一个季度是什么?其余季度的计算是否正确?每个结账日是否有多个余额值?我有不完整的第四季度数据(10月已完成,但11月和12月的数据不完整)。我有一个帐户每个结算日期的余额。我试图在一个简单的矩阵中重新创建上面的示例,以再现错误,但是我得到了聚合错误。有什么想法吗?