如何编写 WHERE 子句以满足 SSRS 报告中的可选参数?

How can I write a WHERE clause to cater for optional paramerers on an SSRS report?

我正在尝试让基本的 SSRS 报告可以通过任何可选参数进行过滤。 要过滤的 2 个参数应该介于 2 个日期之间或按 SalesID。我可以让每个参数单独过滤,但是当我在一个语句中将它们加在一起并尝试 运行 报告时它说 "parameter cannot be blank"。我在网上阅读的建议让我检查 "allow blank values"在参数属性中,但这不适用于 Date/Time.

我在线阅读了它们,它要求我检查参数属性中的 "allow blank values",但这不适用于 Date/Time。我还尝试使用 "OR IS NULL" 添加 WHERE 子句的多种变体,但这不起作用 either.I 还读到我可能需要在某处添加 =IIF 子句,但我以前从未这样做过。

Select SalesID, SalesDate, SaleValue
FROM SalesDb
WHERE (SalesDate BETWEEN @StartDate AND @EndDate AND SalesID IS NULL) OR 
      (SalesID = @SalesID AND @StartDate IS NULL and @EndDate IS NULL) 

如果我 select 开始日期和结束日期,上面的代码 运行s 但它只提取 SalesDate 数据,其他字段为空白。

我希望报表可以按开始日期和结束日期或 SalesID 进行过滤,而不是同时按两者进行过滤。目前上面returns一个错误就是-StartDate不能为空。正如我上面提到的,我无法检查 "allow blank values"。提前致谢。

限制报表生成器参数选择以强制用户指定 SalesIDStartDateEndDate 对不是我在 Report Builder / SSRS 中熟悉的东西,但是我可以为您指出 SQL 查询的解决方案应该满足您的需求。

首先检查参数的允许空值(这适用于Date/time参数,不同于允许空值 ):

完成后,您可以对参数使用 ISNULL 以将数据过滤到所需的子集:

SELECT  SalesID, SalesDate, SaleValue
FROM    SalesDb
WHERE   SalesId = ISNULL(@SalesId, SalesId)
AND     SalesDate BETWEEN ISNULL(@StartDate, SalesDate) AND ISNULL(@EndDate, SalesDate)

SalesId = ISNULL(@SalesId, SalesId) 谓词为例,这告诉 SQL 服务器到 return 行,其中 SalesId 行是:

  1. 等于@SalesId 参数,如果它不为空,或者
  2. 如果@SalesId 为空,则等于行 SalesId 值

这意味着当 @SalesId 为空时,所有行都会 return 准备好应用 @StartDate@EndDate 指定的限制(如果有的话) .

这是我使用的测试工具,可能对你或其他人有用。

CREATE TABLE SalesDb
(
    SalesID INT NOT NULL,
    SalesDate DATETIME NOT NULL,
    SaleValue DECIMAL(10, 2),
)
GO

INSERT
INTO    SalesDb
        (
            SalesID, SalesDate, SaleValue
        )
VALUES  (15, '2019-01-01', 12),
        (16, '2019-01-02', 34),
        (16, '2019-01-03', 56),
        (16, '2019-01-04', 78)

DECLARE @StartDate DATETIME = '2019-01-03', @EndDate DATETIME = '2019-01-04', @SalesID INT = NULL

SELECT  SalesID, SalesDate, SaleValue
FROM    SalesDb
WHERE   SalesId = ISNULL(@SalesId, SalesId)
AND     SalesDate BETWEEN ISNULL(@StartDate, SalesDate) AND ISNULL(@EndDate, SalesDate)