【问题标题】:Handling divide zero when have to use aggregation function必须使用聚合函数时处理除零
【发布时间】:2020-06-19 04:06:13
【问题描述】:

我有一个查询,其中通过公式选择记录包含除法,这是我的查询:

SELECT
    Id AS [ID]
    IIF(max(c.Capacity) = 0, 0.0,
                   max(TRY_CONVERT(float, f.Value) /
                       TRY_CONVERT(float, c.Capacity))) AS [Value],
FROM Form f 
LEFT JOIN Control c 
ON f.ID = c.FormID
GROUP BY 
    f.Id

我的错误是:

遇到除以零错误

问题是我必须使用Group By,它需要max() in IIF(),它不能过滤掉Capacity = 0。有人知道如何解决这个问题吗?

【问题讨论】:

  • 这取决于您实际尝试计算的内容。将 NULL 替换为零是一种方法。在您的特定情况下,您应该只在其上放置一个 WHERE 子句(但这并不能保证您不会收到错误)
  • 我看到你有一个左连接,所以where 不会删除它。而是在您的连接子句中尝试ON f.ID = c.FormID AND c.Capacity <> 0

标签: sql sql-server


【解决方案1】:

假设capacity 永远不会是负数并且值是某种数字,您可以将逻辑简化为:

COALESCE(MAX(f.Value * 1.0 / NULLIF(c.capacity, 0)), 0) as [Value]

如果值已经是数字,而您只是为了避免除以0 而进行转换,则try_convert() 没有错,但它具有误导性。 try_convert() 表示转换可能会失败。

【讨论】:

    【解决方案2】:

    你应该使用NULLIF

    SELECT
        Id AS [ID]
        IIF(max(c.Capacity) = 0, 0.0,
                max(TRY_CONVERT(float, f.Value) /
                        NULLIF(c.Capacity, 0)) AS [Value],
    FROM Form f 
    LEFT JOIN Control c 
    ON f.ID = c.FormID
    GROUP BY 
        f.Id
    

    【讨论】:

    • 谢谢!但我想知道除以 null 是否会比数字减慢查询速度?你有什么主意吗? @热心
    • @NLeeT 据我所知,它不会降低查询性能。
    猜你喜欢
    • 2021-10-09
    • 1970-01-01
    • 2018-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    • 2021-10-12
    相关资源
    最近更新 更多