如何编写 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"。提前致谢。
限制报表生成器参数选择以强制用户指定 SalesID 或 StartDate 和 EndDate 对不是我在 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
行是:
- 等于@SalesId 参数,如果它不为空,或者
- 如果@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)
我正在尝试让基本的 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"。提前致谢。
限制报表生成器参数选择以强制用户指定 SalesID 或 StartDate 和 EndDate 对不是我在 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
行是:
- 等于@SalesId 参数,如果它不为空,或者
- 如果@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)