【问题标题】:SQL Case statement copying an excel formula复制excel公式的SQL Case语句
【发布时间】:2019-02-14 00:45:38
【问题描述】:

我有一个 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 case 语句。

我希望这是一个 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(天)。

【问题讨论】:

  • 样本数据和所需结果的帮助远不止 Excel 公式。数据是什么样的?
  • 你的case表达式是什么样的?因为这看起来很简单......例如case when [Date TCY Vacated]='' then 0 when [Date TCY Tenanted]='' then...
  • 嗨戈登,我在发布问题时很垃圾..不确定如何提供示例数据,基本上这些列都是日期字段,无效开始日期可让日期提供日期接受日期让日期无效开始日期计算 无效 结束日期 计算日期 TCY 空出日期 TCY 租户 13/12/2017 27/12/2017 NULL NULL 13/12/2017 14/12/2017 13/12/2017 13/12/2017 NULL 20/03/ 2018 年 3 月 4 日 2018 NULL NULL 20/03/2018 21/03/2018 19/03/2018 NULL NULL
  • ZLK 用当前不工作的代码更新了问题

标签: sql sql-server excel sql-server-2008 excel-formula


【解决方案1】:

我认为您遇到问题的原因是您使用标准数学运算符来处理日期。

以下示例基于您提供的示例,并进行了一些调整以改用日期函数。它可能无法完美反映您想要的结果,但希望能带您走上大部分路:

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 而不是 '+' 和 '-' 以确保所有操作都在几天内发生。

【讨论】:

    【解决方案2】:

    不是 Case 语句,而是 Excel 函数的 SQL 版本。它应该在 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
    

    【讨论】:

    • 我不清楚你是如何处理你的约会的 - 但这希望能帮助你继续前进。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 2022-06-22
    • 2014-12-05
    相关资源
    最近更新 更多