【问题标题】:SQL Case average formula output issueSQL Case平均公式输出问题
【发布时间】:2015-02-05 21:08:28
【问题描述】:

每个人 - 我可以使用你的帮助。

我有一个 SQL,我在其中检查一列以查看是否有金额。如果没有,我希望它输出 NULL。如果是这样,我希望它计算平均值。我正在使用这个 case 语句并且 NULL 语句工作正常,但我的平均语句只吐出 1 或 0。我已经搜索和测试了几个小时,但没有运气。

CASE 
WHEN SUM(z.[SumTarget$]) = 0 THEN NULL
ELSE (1-(SUM(z.[SumBackorder])+SUM(z.[SumStockedOut]))/SUM(z.[CountofNo]))
END [SumAvPerc]

我已经通过注释掉第 3 行并使用它来检查字符串中的每个字段,以确保数字正确进入公式,到目前为止一切都已检查。

--ELSE SUM(z.[SumStockedOut])

这是字段和输出的示例。 **我无法发布图片,因为我需要更多声望点 :( **

【问题讨论】:

  • 您可以添加图片链接,别人可以为您添加(但文字会更好)。我猜想您的一个(全部?)列的数据类型是整数或某种描述,并且您正在使用对整数执行整数除法的 RDBMS,例如 SQL Server ......但我只是猜测。你的数据类型是什么?您使用的是什么 RDBMS?你能提供一个最小的例子来说明你的问题吗?
  • 是整数数学与十进制数学的问题。如果值以整数开头,则结果将被四舍五入。如果值以十进制开头,则不会。示例:3/2 = 2 而 3/2.0 = 1.5 我认为这与系统如何解释返回的列的数据类型有关。由于涉及的所有值都是整数,因此假定返回整数(不是十进制)

标签: sql sql-server case average


【解决方案1】:

SQL Server 仅对整数进行整数除法,因此您应该将值转换为非整数。

我经常使用* 1.0 来执行此操作,例如:

(CASE WHEN SUM(z.[SumTarget$]) <> 0 
      THEN (1-(SUM(z.[SumBackorder])+SUM(z.[SumStockedOut]))/SUM(1.0 * z.[CountofNo]))
 END) as [SumAvPerc]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多