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

时间:2019-01-02 08:35:26

标签: sql-server datetime parameters where-clause ssrs-2016

我正在尝试获取基本的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不能为空。如上所述,我无法检查“允许空白值”。预先感谢。

1 个答案:

答案 0 :(得分:2)

限制报表生成器参数选择以强制用户指定 SalesID StartDate EndDate 对我对Report Builder / SSRS很熟悉,但是我可以为您提供一种应满足您需求的SQL查询解决方案。

首先检查参数的允许空值(与允许空白值不同,它可用于日期/时间参数):

Report Parameter Properties for a Date/Time parameter in Microsoft SQL Server Report Builder

完成后,可以对参数使用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为以下行:

  1. 等于@SalesId参数(如果不为null),或者
  2. 如果@SalesId为null,则等于行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)