![](/img/trans.png)
[英]Get the average from a column, then filter out all the rows whose number is smaller than the average, and then count the number of row
[英]AVG() is replicating data stored in the row and not providing the average number for the column
我创建了一个查询以从多个列中检索数据。 但是,当使用AVG(*)AVERAGE显示给定列的值时,该函数仅复制并显示每一行中的数据。 我本质上是希望表显示查询中的每一列,并在每一行中显示表的平均值。
如果select语句中没有多个列,则可以查询表以显示给定列的真实平均值。 我尝试使用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;
像这样:
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
您正在按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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.