【问题标题】:Avoid divide by zero with the OVER clause避免使用 OVER 子句除以零
【发布时间】:2016-07-22 11:27:29
【问题描述】:

我有意见:

create view AA(
    select 
    ba.[FYear],right(ba.[FPeriodId],2) Month,am.[L1],am.L2,ba.[SS],ba.[SM],

    sum(ba.[TSB]) OVER (PARTITION BY right(ba.[FPeriodId],2),ba.[SS]) as 'X',
    ba.[TSB]/sum(ba.[TSB]) OVER (PARTITION BY right(ba.[FPeriodId],2),ba.[SS]) as 'Y'

    from [table1] ba left join [b1_map] am on ba.[SS1] = am.[SS1])

我想避免被零除,所以我使用 ISNULL:isnull(ba.[TSB]/sum(ba.[TSB]))

现在当我运行查询时:select * from AA 我收到消息:

"函数 'ISNULL' 不是有效的窗口函数,不能与 OVER 子句一起使用。"

我该如何解决这个问题?

【问题讨论】:

    标签: sql sql-server-2008 window-functions divide divide-by-zero


    【解决方案1】:

    使用NULLIF() 避免被零除:

    (ba.[TSB] /
     NULLIF(sum(ba.[TSB]) OVER (PARTITION BY right(ba.[FPeriodId],2), ba.[SS]), 0)
    ) as Y
    

    另外,我不鼓励您对列别名使用单引号。有一天,当您引用该列时,您将使用它们,从而引入一个难以调试的错误。仅对字符串和日期常量使用单引号。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-07
      • 1970-01-01
      • 1970-01-01
      • 2019-02-03
      相关资源
      最近更新 更多