Как я могу написать предложение WHERE для обслуживания необязательных параметров в отчете SSRS? - PullRequest
0 голосов
/ 02 января 2019

Я пытаюсь получить базовый отчет SSRS для фильтрации по любым необязательным параметрам. Два параметра для фильтрации должны быть либо между двумя датами, либо по SalesID. Я могу заставить каждый параметр фильтровать по отдельности, но когда я добавляю их вместе в оператор и пытаюсь запустить отчет, он говорит: «параметр не может быть пустым». Советы, которые я читаю онлайн, говорят мне, чтобы я проверил «разрешить пустые значения» в параметре свойства, но это не доступно для даты / времени.

Я читаю их в Интернете, и мне предлагается проверить «разрешить пустые значения» в свойствах параметра, но это не доступно для даты / времени. Я также попытался добавить многочисленные варианты предложения 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 голосов
/ 02 января 2019

Ограничение выбора параметра построителя отчетов для принудительного применения пользователем, указав пары 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)

Использование *Предикат 1024 * в качестве примера, он указывает SQL Server возвращать строки, где SalesId для строки: либо:

  1. равно параметру @SalesId, если оно не равно нулю, либо
  2. равно значению SalesId строк, если @SalesId IS равно нулю

Это означает, что когда значение @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)
...