使用OVER子句避免除以零

时间:2016-07-22 11:27:30

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

我有看法:

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子句一起使用。”

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

使用NULLIF()来避免被零除:

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

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