SQLite查询返回总和错误值的原因

时间:2019-04-12 12:28:29

标签: database sqlite

在运行查询时,我在SQLite中遇到了奇怪的行为,我想了解为什么会发生这种行为。

当我运行以下查询时,折扣计算不正确,导致总和不正确。

SELECT sum (quantity * price) - (sum (quantity * price)*(discount/100)) as total
FROM [orderProducts]
JOIN [order] ON [order].id = orderProducts.order_id

折扣为0时,查询的行为符合预期,即正确汇总了订单总数。但是,如果设置了折扣,则总价值不正确。发生总和时,折扣似乎随机应用于行。当我进行一些创意分组时,我得到了正确的行为

SELECT sum (total) FROM (SELECT sum (quantity * price) - (sum (quantity * price)*(discount/100)) as total
FROM [orderProducts]
JOIN [order] ON [order].id = orderProducts.order_id
GROUP BY [order].id)

所以我的问题是,为什么这会有很大的不同?在使折扣看似随机适用的第一个查询中发生了什么?

要测试查询,您可以使用此语句制作表格

create table orderProducts 
(
id int NOT NULL,
order_id NOT NULL,
quantity int(3),
price double NOT NULL,
primary key (id),
foreign key (order_id) references [order]
);

create table order
(
id int NOT NULL,
discount double NOT NULL,
primary key (id)
);

要添加数据,您可以使用

insert into order (id, discount) values (1, 10.0);
insert into order (id, discount) values (2, 0.0);

insert into orderProducts (id, order_id, quantity, price) values (1, 1, 1, 20);
insert into orderProducts (id, order_id, quantity, price) values (2, 2, 1, 50);

运行总和查询的预期输出为68,但实际输出为70

1 个答案:

答案 0 :(得分:1)

如果您希望从样本数据中获得68,则可以达到目的:

SELECT sum(quantity * price) - sum((quantity * price) * (discount / 100)) AS total
FROM orderProducts
JOIN "order" ON "order".id = orderProducts.order_id;

您的原始查询使用sum(quantity * price) * (discount / 100)-也就是说,它会将所有行的总和乘以一个百分比,而不是将每一行的总和乘以该行的折扣百分比并将这些数字相加。

还请注意,我在order表名周围使用双引号而不是方括号;引号是转义标识符的常规标准SQL方法;括号是Sqlite支持某种程度的兼容性的MS-SQL内容。