Запрос абсолютного значения в таблице при отображении одного результата

#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
 

Демонстрация на dbfiddle

Ответ №2:

У меня была та же проблема. Я немного поиграл с этим и обнаружил, что этот запрос работает для меня: не могу объяснить, почему он работает.

Надеюсь, кто-нибудь сможет это объяснить

 select *, ABS(P_PRICE - (select avg(P_PRICE) from product)) as Difference from product