【问题标题】:Calculating a % inside a case statement not working correctly在 case 语句中计算 % 不能正常工作
【发布时间】:2020-05-10 14:49:56
【问题描述】:

我正在尝试将某人与合作伙伴的支出百分比计算为他们在所有合作伙伴中的总支出的百分比。我在下面的案例语句中执行此操作..代码运行但是当我测试一些标记为 90% 的示例时,它们在下面。我使用 teradata sql 进行了尝试,并且通过计算 %'s 然后将它们过滤掉,在 SAS 的多个阶段中解决了这个问题。只是想了解为什么以下内容似乎无法正常工作?

case when partner_spend > 0 and  partner_spend/total_spend >= 0.9 
    then '90% partner' 
    else 'other' 
end as spend_90

提前致谢

【问题讨论】:

  • 这些列的数据类型是什么?十进制?

标签: sql sas case teradata calculation


【解决方案1】:

问题很可能是整数除法。如果两个值都是整数或类似的值,Teradata 将产生一个整数结果,应用舍入规则:所以基本上如果结果为0.5 或更大,结果将为1

您可以通过将值转换为具有足够精度的小数或添加(虚拟)乘数来解决此问题:

case when partner_spend > 0 and 1.00 * partner_spend/total_spend >= 0.9 
    then '90% partner' 
    else 'other' end 
as spend_90

或者:

case when partner_spend > 0 and cast(partner_spend as decimal(10, 2))/total_spend >= 0.9 
    then '90% partner' 
    else 'other' end 
as spend_90

【讨论】:

  • 如果这些列是 INT 标准 SQL/Teradata 将不应用舍入,而是截断,只舍入 DECIMAL :-)
【解决方案2】:

除非total_spend可以为负,否则第一个条件没有用,所以可以简化为:

(case when partner_spend * 1.0 / total_spend >= 0.9 
      then '90% partner' 
      else 'other' 
 end) as spend_90

或者,我更喜欢:

(case when partner_spend >= total_spend * 0.9 
      then '90% partner' 
      else 'other' 
 end) as spend_90

我使用各种数据库,不喜欢记住特定数据库是否进行整数除法。所以,这避免了分裂。

【讨论】:

  • 第一个条件有助于避免除以零错误。
  • 感谢所有我现在明白为什么它不工作并应用上述检查并且它工作!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-14
  • 2022-06-22
  • 2014-11-13
  • 2017-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多