Оператор SQL Case, копирующий формулу Excel - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть отчет Excel, который я пытаюсь преобразовать в отчет SSRS, используя сохраненный процесс.В существующем excel (не написанном мной) формула выглядит следующим образом:

=IF( [Date TCY Vacated]="",0,IF([Date TCY Tenanted]="",Summary!$B$3 - ( [Date TCY Vacated]+1), IF( ( [Date TCY Tenanted] -1)- ( [Date TCY Vacated] +1) <0,0,  ( [Date TCY Tenanted] -1)- ( [Date TCY Vacated] +1)   )   ))

Я пытаюсь преобразовать это в выражение SQL.

Я ожидаю, что это будетINT, так что я могу суммировать столбец, чтобы получить общее количество дней, свободных от свойства

Case When [Date TCY Vacated] Is Null Then '0' 
                    else case when [Date TCY Tenanted] = '' then @End - ([Date TCY Vacated]+1)
                    else case when ([Date TCY Tenanted] - 1) - ([Date TCY Vacated] +1) < 0 then 0
                    else  Convert(Varchar(30),[Date TCY Tenanted],120) - Convert(Varchar(30),[Date TCY Vacated],120) end end end as 'Void Days'

Пробовал, но не работает, я пытаюсь добавить пример данных, но не знаю, как.Все поля являются полями даты, ожидаемые результаты будут 2018-02-14 - 2018-02-12 = 2 (дней).

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Я думаю, причина ваших проблем в том, что вы используете стандартные математические операторы для работы с датами.

Приведенный ниже пример основан на предоставленных вами примерах с некоторыми настройками для использования функций даты.Он может не полностью отражать ваш желаемый результат, но, надеюсь, займет у вас большую часть пути:

CREATE TABLE #a ([Date TCY Vacated] DATE, [Date TCY Tenanted] DATE)

INSERT INTO #a ([Date TCY Vacated], [Date TCY Tenanted])
    VALUES ('2018-02-10', '2018-02-08')
            ,(NULL, '2018-02-08')
            ,('2018-02-10', NULL)
            ,('2018-02-10', '2018-02-28')


DECLARE @End DATE = GETDATE()

SELECT *,
        CASE WHEN [Date TCY Vacated] IS NULL
            THEN    0
            ELSE    CASE WHEN [Date TCY Tenanted] IS NULL 
                        THEN    DATEDIFF(d, @End, DATEADD(d, 1, [Date TCY Vacated]))
                        ELSE    CASE WHEN DATEADD(d, -1, [Date TCY Tenanted]) < DATEADD(d, 1, [Date TCY Vacated])
                                    THEN    0
                                    ELSE    DATEDIFF(d, DATEADD(d, -1, [Date TCY Tenanted]), DATEADD(d, 1, [Date TCY Vacated]))
                                END
                    END
        END
FROM #a

В частности, этот код использует DATEADD и DATEDIFF вместо '+' и '-' для обеспечения выполнения всех операций.в днях.

0 голосов
/ 14 февраля 2019

Не оператор Case, а версия SQL вашей функции Excel.Он должен работать в SSRS

Declare @tcyv Int = 1
Declare @tcyt Int = ''
Declare @summ Int = 300

Select iif(@tcyv = '', 0,
            iif(@tcyt = '', @summ - (@tcyv+1),
            iif(((@tcyt-1) - (@tcyv+1)) < 0, 0,
                 (@tcyt-1) - (@tcyv+1)))) As x

С оператором CASE:

Select Case When @tcyv = '' Then 0
            When @tcyt = '' Then @summ - (@tcyv+1)
            When((@tcyt-1) - (@tcyv+1)) < 0 Then 0
             Else    (@tcyt-1) - (@tcyv+1) End As x             

Результат:

298
...