如何获得最后一个月';SQL Server中一个季度的数据是多少?

如何获得最后一个月';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

我正在尝试创建一个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
当我按季度分组时,我只想要季度数据的最后一个月。例如,对于第一季度,我想要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月的数据不完整)。我有一个帐户每个结算日期的余额。我试图在一个简单的矩阵中重新创建上面的示例,以再现错误,但是我得到了聚合错误。有什么想法吗?