如何获取SQL Server四分之一的上个月数据?

时间:2016-12-02 20:47:26

标签: 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             $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

3 个答案:

答案 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)

创建两个矩阵,如下所示:

每月报告:

enter image description here

季度报告:

enter image description here

可以使用以下表达式计算Quarter行组:

Database View

要使用季度:

=DatePart(DateInterval.Quarter,Fields!BillingDate.Value)

要使用最后一个余额值:

="BillingDate Q" & DatePart(DateInterval.Quarter,Fields!BillingDate.Value)

还考虑按Account创建父行组。

结果如下:

enter image description here

我创建了一个虚拟数据集,其中包含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