我正在构建一个 SSRS 报告,显示已售商品的基本销售历史记录。用户输入项目#、开始日期和结束日期作为参数。主表逐行显示输入的商品以及开始/结束日期之间的销售日期的销售信息。
作为报告的一部分,我想在文本框中包含一些关键的汇总数据,这些数据将显示:
如果我可以将它们标记为“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 |
如果需要更多信息或有任何其他问题,请告诉我。谢谢你。
您没有提供自己的 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 |
这是我如何处理此问题的一个非常通用的示例。
据我所知,您目前有一份工作报告,显示两个日期之间的销售数据。因此,我假设您的数据集查询看起来像这样
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")
。