AVG () копирует данные, хранящиеся в строке, и не предоставляет среднее число для столбца - PullRequest
0 голосов
/ 23 января 2019

Я создал запрос для получения данных из нескольких столбцов. Однако при использовании AVG (*) AVERAGE для отображения значения для данного столбца функция просто реплицирует и отображает данные в каждой строке. По сути, я хочу, чтобы таблица отображала каждый столбец в запросе и отображала среднее значение таблицы в каждой строке.

Если у меня нет нескольких столбцов в операторе выбора, тогда я могу запросить таблицу, чтобы отобразить истинное среднее значение для данного столбца. Я пытался использовать UNION и SELF JOIN для запроса AVG (*) AVERAGE, но безуспешно.

CREATE TABLE INVOICE
(
    INV_NUM NUMBER NOT NULL PRIMARY KEY,
    CUST_NUM NUMBER NOT NULL REFERENCES CUSTOMER(CUST_NUM),
    INV_DATE DATE NOT NULL,
    INV_AMOUNT NUMBER NOT NULL
);


INSERT ALL
INTO (INV_NUM,CUST_NUM,INV_DATE,INV_AMOUNT) 
VALUES ('8000','1000','3/23/2014','235.89')


INTO (INV_NUM,CUST_NUM,INV_DATE,INV_AMOUNT) 
VALUES ('8001','1001','3/23/2014','312.82')


INTO (INV_NUM,CUST_NUM,INV_DATE,INV_AMOUNT) 
VALUES ('8002','1002','3/30/2014','528.10')       


INTO (INV_NUM,CUST_NUM,INV_DATE,INV_AMOUNT) 
VALUES ('8003','1003','4/12/2014','194.78')


INTO (INV_NUM,CUST_NUM,INV_DATE,INV_AMOUNT) 
VALUES ('8004','1004','4/23/2014','619.44')

SELECT * FROM DUAL;

--------------TABLE QUERIES----------------

SELECT INV_NUM, INV_AMOUNT, AVG(INV_AMOUNT) AVERAGE, 
AVG(INV_AMOUNT)-INV_AMOUNT DIFFERENCE
FROM INVOICE
GROUP BY INV_NUM, INV_AMOUNT;

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Вы агрегируете по INV_NUM и INV_AMT, поэтому вы вообще не агрегировали.

Я думаю, что вы хотите аналитическую функцию вместо агрегирования:

SELECT INV_NUM, INV_AMOUNT,
       AVG(INV_AMOUNT) OVER () as AVERAGE, 
       (AVG(INV_AMOUNT) OVER () - INV_AMOUNT) as DIFFERENCE
FROM INVOICE;
0 голосов
/ 23 января 2019

Примерно так:

with invoice as (
select 
8000 INV_NUM,1000 CUST_NUM,'3/23/2014' INV_DATE,235.89 INV_AMOUNT
from dual union all
select 8001,1001,'3/23/2014',312.82
from dual union all
select 8002,1002,'3/30/2014',528.10
from dual union all
select 8003,1003,'4/12/2014',194.78
from dual union all
select 8004,1004,'4/23/2014',619.44 from dual)
SELECT INV_NUM, INV_AMOUNT, AVERAGE, 
AVERAGE-INV_AMOUNT DIFFERENCE
FROM INVOICE,(select avg(inv_amount) average from invoice)
ORDER BY INV_NUM, INV_AMOUNT
...