【问题标题】:SQLite REAL sum vs totalSQLite 真实总和与总和
【发布时间】:2013-11-21 10:36:47
【问题描述】:

请帮助我理解 SQLite3 给出的以下结果。

SELECT * 
FROM quantities 
WHERE product_id=1;

1|2|1|15,900000
96|4|1|1,000000
97|5|1|1,000000
98|3|1|1,400000

SELECT TOTAL(quantity) 
FROM quantities 
WHERE product_id=1;

18.0

SELECT SUM(quantity) 
FROM quantities 
WHERE product_id=1;

18.0

数量表中的最后一个字段quantityREAL

似乎在进行REAL 总和之前完成了到INT 的转换。 我可以解决这个问题吗?

【问题讨论】:

    标签: sql sqlite select floating-point sum


    【解决方案1】:

    您的数据中有逗号, 代替小数点.

    当将列值相加时,sqlite 只是尝试将列值解释为数值并放弃,直到找到无法转换为数字的内容,使用目前遇到的任何数字:

    sqlite> create table a(a);
    sqlite> insert into a values('1,1'),('2.2'),('100foo');
    sqlite> select sum(a) from a;
    103.2
    

    【讨论】:

    • @user3017078 可以使用UPDATE Quantities SET Quantity=CAST(REPLACE(Quantity, ',', '.') AS REAL);将值转换为实数
    【解决方案2】:

    我不明白这个问题......它在 sqlite 中对我来说很好用。 下面的示例(您确定该列是真实的吗?)

    create table if not exists quantities (product_id integer,quantity real);
    
    insert into quantities values (1,   15.9);
    insert into quantities values (1,   1);
    insert into quantities values (1,   1);
    insert into quantities values (1,   1.4);
    
    select      product_id,
                SUM(quantity)
    FROM        quantities
    GROUP BY    product_id;
    

    然后返回...

    1   19.3
    

    如果我使用 TOTAL( 而不是 SUM( 它也会返回 19.3

    可以在以下位置看到一个工作示例 http://www.datagloop.com/?USERNAME=DATAGLOOP/SO_TRUNC

    【讨论】:

    • sqlite> .schema 数量 CREATE TABLE QUANTITIES(ID INTEGER PRIMARY KEY AUTOINCREMENT,LOCATION_ID INTEGER NOT NULL,PRODUCT_ID INTEGER NOT NULL,QUANTITY REAL NOT NULL);
    • @user3017078 注意 SQLite 不强制执行 REAL - 你可能有 TEXT 代替。用SELECT *, TYPEOF(quantity) FROM Quantities;检查它
    • Ty,我确实有: sqlite> SELECT *, TYPEOF(quantity) FROM Quantities; 1|2|1|15,900000|text 所以我必须确保当我添加一个新行时,实数文本是带点的?这足以确保一致性吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多