在SSRS中,如何根据日期参数显示过去的销售汇总结果?

问题描述 投票:0回答:2

我正在构建一个 SSRS 报告,显示已售商品的基本销售历史记录。用户输入项目#、开始日期和结束日期作为参数。主表逐行显示输入的商品以及开始/结束日期之间的销售日期的销售信息。

作为报告的一部分,我想在文本框中包含一些关键的汇总数据,这些数据将显示:

  • 数量过去 6 个月已售出
  • 数量今年已售出
  • 数量去年已售出

如果我可以将它们标记为“2022 年销售数量”(去年),并根据输入的“开始日期”参数进行更新,那就更好了。因此,如果用户输入 2021 年某个时间的开始日期,它将显示为“数量。2020 年已售出”。

我很难知道如何总结数量并根据开始日期和结束日期更改正在查看的日期范围。

样本数据:

参数: 开始日期=Jan/01/2023 结束日期=Feb/28/2023 货号=009833

发布日期 订单号 客户 货号 数量。
2023 年 1 月 1 日 25467 乔·史密斯 009833 4
2023 年 2 月 6 日 26802 彼得 009833 27
2023 年 2 月 20 日 26980 桑德拉·W. 009833 11

如果需要更多信息或有任何其他问题,请告诉我。谢谢你。

sql-server reporting-services parameter-passing ssrs-2012
2个回答
0
投票

您没有提供自己的 DDL/DML(这确实有助于回答此类问题),因此我使用了自己的随机数据,这是一个非常简单的销售类型设置。

DECLARE @StartDate DATETIME = '2023-01-01', @EndDate DATETIME = '2023-02-28 23:59:59.997', @ProductID INT = 5;

;WITH ProductHistory AS (
SELECT ii.ProductID, SUM(CASE WHEN InvoiceDateTimeUTC > DATEADD(MONTH,-6,@StartDate) THEN ii.Quantity END) AS LastSixMonths, 
                     SUM(CASE WHEN InvoiceDateTimeUTC BETWEEN DATEFROMPARTS(DATEPART(YEAR,@StartDate)-1,1,1) AND DATEFROMPARTS(DATEPART(YEAR,@StartDate),1,1) THEN ii.Quantity END) AS PreviousCalendarYear
  FROM InvoiceItems ii
    INNER JOIN Invoices i
      ON ii.InvoiceID = i.InvoiceID
 WHERE ii.ProductID = @ProductID
   AND i.InvoiceDateTimeUTC >= DATEFROMPARTS(DATEPART(YEAR,@StartDate)-1,1,1)
 GROUP BY ProductID
)

SELECT i.InvoiceDateTimeUTC, i.InvoiceID, c.FirstName, c.LastName, ii.ProductID, SUM(ii.Quantity) AS TotalQuantity, ph.LastSixMonths, ph.PreviousCalendarYear, DATEPART(YEAR,@StartDate)-1 AS PreviousYearNumber
  FROM InvoiceItems ii
    LEFT OUTER JOIN ProductHistory ph
      ON ii.ProductID = ph.ProductID
    INNER JOIN Invoices i
      ON ii.InvoiceID = i.InvoiceID
    INNER JOIN Customers c
      ON i.CustomerID = c.CustomerID
 WHERE ii.ProductID = @ProductID
   AND InvoiceDateTimeUTC BETWEEN @StartDate AND @EndDate
 GROUP BY i.InvoiceDateTimeUTC, i.InvoiceID, c.FirstName, c.LastName, ii.ProductID, ph.LastSixMonths, ph.PreviousCalendarYear;

我们在这里使用

CTE
来通过操作输入参数来进行您想要的聚合,然后加入到该
CTE
中。返回动态列名称并不简单,但您可以将 PreviousYearNumber 列添加到标题中。

发票日期时间UTC 发票ID 名字 姓氏 产品ID 总数量 过去六个月 上一个日历年 上一年编号
2023-01-11 14:55:15.9633333 357 乔治 坎贝尔 5 1 9030 8135 2022
2023-02-03 15:41:15.9633333 951 多萝西 里维拉 5 1 9030 8135 2022
2023-02-24 16:23:15.9633333 1722 黛布拉 门多萨 5 1 9030 8135 2022
2023-01-23 15:19:15.9633333 3080 罗纳德 戈麦斯 5 1 9030 8135 2022
2023-01-05 14:43:15.9633333 4455 雷切尔 休斯 5 1 9030 8135 2022
2023-02-27 16:28:15.9633333 5898 黛博拉 罗伯茨 5 1 9030 8135 2022
2023-02-16 16:06:15.9633333 6070 罗纳德 戈麦斯 5 1 9030 8135 2022
2023-01-27 15:26:15.9633333 7163 威廉 埃尔南德斯 5 1 9030 8135 2022
2023-02-12 15:59:15.9633333 7482 雪莉 奥尔蒂斯 5 1 9030 8135 2022
2023-01-17 15:07:15.9633333 7959 瑞安 柯林斯 5 1 9030 8135 2022

0
投票

这是我如何处理此问题的一个非常通用的示例。

据我所知,您目前有一份工作报告,显示两个日期之间的销售数据。因此,我假设您的数据集查询看起来像这样

SELECT * 
    FROM mySalesTable 
    WHERE ItemNo = @ItemNo 
        AND PostingDate Between @StartDate AND @EndDate

现在您想要添加一些额外的摘要信息,但数据未在主数据集中捕获,因为主数据集中仅包含两个特定点之间的可用数据。

因此,我将创建另一个名为

dsSummary
的数据集,并为此编写一个新查询。类似的东西..

declare @Last6Months INT
declare @LastYear INT 
declare @ThisYear INT 

-- get last 6 monmths from startdate
SELECT @Last6Months = SUM(qty) 
    FROM mySalesTable 
    WHERE ItemNo = @ItemNo 
        AND PostingDate BETWEEN DATEADD(m, -6, @StartDate) AND @StartDate

-- get last year 
SELECT @LastYear = SUM(qty) 
    FROM mySalesTable 
    WHERE ItemNo = @ItemNo 
        AND YEAR(PostingDate) = YEAR(@StartDate)-1

-- get this year 
SELECT @ThisYear = SUM(qty) 
    FROM mySalesTable 
    WHERE ItemNo = @ItemNo 
        AND YEAR(PostingDate) = YEAR(@StartDate)

SELECT 
    @Last6Months as Last6Months,
    @LastYear as LastYear,
    @ThisYear as ThisYear

这仅使用您已有的

@StartDate
参数,并基于该参数运行 3 个查询,并返回包含三个结果的单行。

你可以用不同的方式写这个,因为它不是很有效,但我保持简单,所以很容易理解。

现在您拥有了新的数据集,您可以将文本框添加到报告中并将表达式设置为

=FIRST(Fields!Last6Month.Value, "dsSummary")

© www.soinside.com 2019 - 2024. All rights reserved.