Я столкнулся со странным поведением в 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