在运行查询时,我在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
答案 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内容。