sqlite> create table test (Qty DECIMAL(10,2));
sqlite> insert into test values(1059.79);
sqlite> insert into test values(-1050);
sqlite> insert into test values(83.58);
sqlite> insert into test values(130.51);
sqlite> insert into test values(-5);
sqlite> insert into test values(-136.68);
sqlite> insert into test values(-2.6);
sqlite> insert into test values(-75);
sqlite> insert into test values(-4.6);
sqlite> select sum(Qty) FROM TEST;
-6.21724893790088e-14
鉴于我明确指定DECIMAL(10,2)作为字段类型,为什么总和不是0?
答案 0 :(得分:2)
SQLite没有DECIMAL
类型。使用64位浮点值执行数学运算。
答案 1 :(得分:1)
而不是搞乱,并使我的sql与我支持的其他数据库不兼容,我只是为SQLite SUM函数编写了一个用户定义的替换,如下所示:
[SqliteFunctionAttribute(Name = "SUM", Arguments = 1, FuncType = FunctionType.Aggregate)]
class SqliteSum : SqliteFunction {
public override void Step(object[] args, int stepNumber, ref object contextData) {
if (args.Length < 1 || args[0] == null || args[0] == DBNull.Value)
return;
try {
decimal d = Math.Round(Convert.ToDecimal(args[0]), 4);
if (contextData != null) d += (Decimal)contextData;
contextData = d;
} catch (Exception ex) {
WebServer.Log("Exception: {0}", ex);
}
}
public override object Final(object contextData) {
return contextData;
}
}
答案 2 :(得分:0)
SQLite没有十进制类型:
NULL
INTEGER
REAL
TEXT
BLOB
所以也许将它转换为Text,然后进行求和。 SQLite功能强大,可以依赖于计算和数学。