#sql
#sql
Вопрос:
У меня проблема, когда я пытаюсь определить разницу между ценой каждого продукта и средней ценой продукта.
Я сделал некоторый код, чтобы получить абсолютную разницу в цене продукта, превышающую среднюю цену продукта.
select * , ABS(P_PRICE - avg(P_PRICE)) as Difference from product;
Когда я запускаю приведенный выше код, я получаю один единственный продукт и разницу от средней цены, когда я пытаюсь получить список всех продуктов и их средние цены
Вот как выглядит таблица продуктов: таблица продуктов
Комментарии:
1. Это SQL Server или MySQL?
Ответ №1:
Причина, по которой это происходит, заключается в том, что вы используете функцию агрегирования без GROUP BY
предложения, что означает, что в конечном итоге вы получаете агрегированные результаты для всех данных, то есть для одной строки. Вам нужно вычислить среднюю цену отдельно, а затем вычесть ее из цены каждого продукта. Что-то вроде этого:
SELECT p1.*, ABS(p1.P_PRICE - p2.avg_price) AS Difference
FROM product p1
CROSS JOIN (SELECT AVG(P_PRICE) AS avg_price FROM product) p2
Или вы можете сгенерировать среднюю цену в подзапросе, но это, вероятно, будет менее эффективным.
SELECT *, ABS(P_PRICE - (SELECT AVG(P_PRICE) AS avg_price FROM product)) AS Difference
FROM product
Ответ №2:
У меня была та же проблема. Я немного поиграл с этим и обнаружил, что этот запрос работает для меня: не могу объяснить, почему он работает.
Надеюсь, кто-нибудь сможет это объяснить
select *, ABS(P_PRICE - (select avg(P_PRICE) from product)) as Difference from product