【问题标题】:Fixing divide by zero error with case statement使用 case 语句修复除以零错误
【发布时间】:2019-05-13 18:50:32
【问题描述】:

我继承了一些除以零错误的代码。

我不断收到错误消息,不确定是代码还是我将其放置在哪里。 应该添加这条线还是替换一条线?

尝试用这个 case 语句添加和替换: CASE WHEN SUM(PREOP_MME) = 0 THEN 0 ELSE SUM(PREOP_MME) / SUM(COUNT_CASES) END AS PREOP_MME)。

SELECT 

PROCEDURE_NM
,SUM(PreOp_MME)     / SUM(COUNT_CASES) PreOp_MME
,SUM(IntraOp_MME)   / SUM(COUNT_CASES) IntraOp_MME 
,SUM(PostOp_MME / PostOp_LOS) PostOp_MME
,SUM(Discharge_MME) / SUM(COUNT_CASES) Discharge_MME
,SUM(TOTAL_OVERALL_MME) / SUM(COUNT_CASES) Overall_MME


FROM (

SELECT DISTINCT 

Spine.LOG_ID
,Spine.SERV_AREA_ID [Service Area ID]
,Spine.LOC_ID [Revenue Location ID] 
,Spine.PRIMARY_PHYS_ID [Provider ID]
,Spine.SURGERY_DATE
,Spine.COUNT_CASES
,Spine.PROCEDURE_NM
,Spine.PostOp_LOS

,(PreOp.SUM_SIG * PreOp.PreOp_MME)          AS PreOp_MME
,(IntraOp.SUM_SIG * IntraOp.IntraOp_MME)    AS IntraOp_MME
,(PostOp.SUM_SIG * PostOp.PACU_MME)         AS PostOp_MME
,DischMeds.DOSE_MME                 AS     Discharge_MME

,(PreOp.SUM_SIG * PreOp.PreOp_MME) + 
 (IntraOp.SUM_SIG * IntraOp.IntraOp_MME) + 
 (PostOp.SUM_SIG * PostOp.PACU_MME) + DischMeds.DOSE_MME as TOTAL_OVERALL

【问题讨论】:

  • 我猜你倒置了这些值。因为如果A = 0 那么A / anything 也是0,你就不需要案例了
  • 顺便说一句,您遇到了什么错误?因为在mysql中A / 0没有报错,只返回null。
  • 你使用的DB是MySql吗?别名如 [Service Area ID] 说 MSSQL。 MySql 应该看起来像 `Service Area ID`
  • 这是一个错误 - 这是 MSSql。

标签: sql-server


【解决方案1】:

您应该检查除数(分母)而不是除数(分子)不等于 0 所以对于第一列您可以尝试

SELECT 

    PROCEDURE_NM, 
    case when SUM(COUNT_CASES) = 0 
                  then 0 
                  else SUM(PreOp_MME)/ SUM(COUNT_CASES) end PreOp_MME,
    .....

【讨论】:

    【解决方案2】:

    只需使用COALESCE

    这里我构建一个小的demo作为例子

    SELECT id,
           SUM(`value1`) / SUM(`value2`) as _before,
           COALESCE (SUM(`value1`) / SUM(`value2`) , 0) as _after
    FROM Table1
    GROUP by id;
    

    【讨论】:

      【解决方案3】:

      感谢您的回答。

      我使用 CASE WHEN SUM(FIELD) = 0 THEN 0 ELSE SUM(FIELD) / SUM(FIELD) END AS

      我的错误是因为我没有在每个实例中都考虑零,而只考虑第一个。该回家了!

      【讨论】:

      • 除非添加更多相关信息,否则您不必发布答案。通过接受 scaisEdge 回答,您就是在说解决了您的问题。
      猜你喜欢
      • 1970-01-01
      • 2014-08-09
      • 1970-01-01
      • 2015-03-16
      • 1970-01-01
      • 1970-01-01
      • 2021-05-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多