2013-09-09 2 views
2

Моя таблица oracle выглядит так: «счет-фактура».Показать значение функции SQL AVG во всех строках

INV_NUM CUST_NUM INV_DATE    INV_AMOUNT 

8000  1000 23-Mar-08    235.89 
    8001  1001 23-Mar-08    312.82 
    8002  1001 30-Mar-08     528.1 
    8003  1000 12-Apr-08    194.78 
    8004  1000 23-Apr-08    619.44 

Мне нужно написать запрос на выборку, который Diplay в inv_num, inv_amount и среднее inv_amount. Ожидаемый результат выглядит следующим образом.

INV_NUM INV_AMOUNT  AVG(INV_AMOUNT) 

8000  235.89    378.206 
    8001  312.82    378.206 
    8002  528.1    378.206 
    8003  194.78    378.206 
    8004  619.44    378.206 

Я хочу, чтобы значение из функции AVG будет повторяться в каждой строке. Я понимаю, что функция AVG возвращает только одну строку. Я получаю сообщение об ошибке при попытке выполнить этот запрос.

select inv_num,inv_amount,avg(inv_amount) from invoice; 

ERROR at line 1: ORA-00937: not a single-group group function 

Есть ли способ, чтобы значение avg отображалось в каждой строке? Мне нужна помощь в этом. Благодарю.

ответ

4

Вы хотите использовать аналитическую функцию:

select inv_num, inv_amount, avg(inv_amount) over() as avg_inv_amount 
from invoice; 

Аналитические функции класса функций, которые очень похожи на функции агрегации. Однако вместо уменьшения количества строк значение помещается в каждую строку исходных данных. В этом случае круглые скобки пусты. Они также могут (в данном случае) принять условие partition by. Например, следующее будет давать среднее значение для каждого клиента:

select inv_num, inv_amount, avg(inv_amount) over (partition by cust_num) as avg_inv_amount 
from invoice; 
+0

Большое спасибо! Это именно то, чего я хотел. – user1563210

Смежные вопросы