【问题标题】:Sum returns 0 on a money columnSum 在货币列上返回 0
【发布时间】:2018-01-09 15:58:24
【问题描述】:

当我运行这个查询时:

SELECT [id],[amount],sum(amount) as Total
  FROM transaction
    where id='035'
  group by id, amount

我得到了一些类似的结果

id          amount      Total
035         -55115.24   -55115.24
035         -2126.14    -2126.14 

但是,当我尝试获取总数(对于 amount 列)时,使用此查询;

 select id, count(*) as howMany, sum(amount) as Total
from transaction
where id='035'
group by id
order by count(*) desc

我得到了这些结果。

id              howMany Total
035             2        0.00

我希望得到

id              howMany Total
035             2        -057241.38

我试图简化查询,不计算,只是为了检查总和是否有效

select id, sum(amount) as Total
from transaction
where id='035'
group by id

但这又给了我 0 作为我的总数

id     Total
035     0.00

我也在数量列中具有正值但行为相同的 id 上尝试过此操作。

为了澄清,我想要整个表中每个 idamount 列中的值的总和,而不仅仅是每一行,但在 SQL 中使用 SUM 函数时我只得到零.

我注意到的另一件事是,id 列是 nvarchar,而不是表的 ID/键。这是一个旧数据库,出于某种原因,它倾向于将 nvarchars 链接到主键之上。我无法更改表结构。

架构

CREATE TABLE [dbo].[transaction](
    [trindex] [int] IDENTITY(1,1) NOT NULL,
    [id] [varchar](15) NULL,
    [date] [datetime] NULL,
    [amount] [money] NULL,
    [acct] [varchar](20) NULL
)

【问题讨论】:

  • 您是在 SQL Server Management Studio 中还是通过应用程序运行此查询?我的第一个猜测是应用程序正在更改值。
  • 我正在通过 SSMS 运行它。应用程序不会更改这些值
  • 从一个简单的 sql 中得到什么:SELECT [id],[amount] FROM transaction where id='035' and what datatype is amount?
  • 如果你运行 SELECT SUM(CAST(amount AS DECIMAL(18,6))) FROM TRANSACTION WHERE id='035' 会有什么结果?
  • 我猜可能是 2005 年,尝试在求和之前转换为数字:select id, SUM(amount), SUM(convert(numeric(18,2), amount))

标签: sql sql-server tsql sql-server-2005


【解决方案1】:

在求和之前尝试转换为数字:select id, SUM(amount), SUM(convert(numeric(18,2), amount))

【讨论】:

  • 我很想知道在什么情况下需要这样做。如果你给 sum() 一个无效的数据类型,你应该得到错误“操作数数据类型 $foo 对 sum 运算符无效。”
  • Money 不是一个精确的数据类型,但我仍然同意.. 我在 2012 年得到了正确的金额。
  • 我认为是准确的,但 +- 55000 远不止不准确
  • AFAIK,money 数据类型可能会在计算中引入舍入误差(虽然不是加法)。这也是一个很大的“舍入”……但现在已经解决了。
  • 我也很想知道这里发生了什么:) 很奇怪。我不明白为什么转换为数字有效,但转换为其他任何东西都会给我零。该数据库链接到一个非常旧的系统,并且以前已知有奇怪的行为。
猜你喜欢
  • 2016-04-01
  • 2015-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多