Причина, по которой запрос SQLite возвращает неправильное значение с суммой - PullRequest
0 голосов
/ 12 апреля 2019

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

1 голос
/ 12 апреля 2019

Если вы ожидаете получить 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 избежать идентификаторов; скобки - это то, что MS-SQL поддерживает Sqlite для некоторой степени совместимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...