我正在尝试获取基本的SSRS报告,以便可以通过任何可选参数进行过滤。 要过滤的2个参数应介于2个日期之间或按SalesID。我可以让每个参数单独过滤,但是当我将它们添加到语句中并尝试运行报表时,它会显示“参数不能为空”。我在网上阅读的建议说我要检查参数中的“允许空白值”属性,但不适用于日期/时间。
我在线阅读它们,它要求我检查参数属性中的“允许空白值”,但这不适用于日期/时间。我还尝试过使用“ OR IS NULL”添加WHERE子句的多种变体,但这也不起作用。我还读到我可能需要在某处添加= 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)
如果我选择一个“开始日期”和“结束日期”,则上面的代码将运行,但是它只提取SalesDate数据,而其他字段为空。
我希望报表可以使用“开始日期”和“结束日期”或“ SalesID”(而不是两者)进行过滤。目前,以上内容返回了一个错误,即StartDate不能为空。如上所述,我无法检查“允许空白值”。预先感谢。
答案 0 :(得分:2)
限制报表生成器参数选择以强制用户指定 SalesID 或 StartDate 和 EndDate 对我对Report Builder / SSRS很熟悉,但是我可以为您提供一种应满足您需求的SQL查询解决方案。
首先检查参数的允许空值(与允许空白值不同,它可用于日期/时间参数):
完成后,可以对参数使用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 Server返回行的SalesId
为以下行:
这意味着当@SalesId
为空时,将返回所有行,以准备应用@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)