sql - AVG() 正在复制存储在行中的数据,而不是提供列的平均数
问题描述
我创建了一个查询来从多个列中检索数据。但是,当使用 AVG(*) AVERAGE 显示给定列的值时,该函数只是复制并显示每一行中的数据。我本质上希望表格显示查询中的每一列,并在每一行中显示表格平均值。
如果我在选择语句中没有多个列,那么我可以查询表以显示给定列的真实平均值就好了。我尝试使用 UNIONs 和 SELF JOINs 来查询 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
推荐阅读
- .net - 如何将 IIS 和 NET 框架语言更改为英语
- kubernetes - 如何迁移到 k8s kustomize?
- c++ - 如何管理 C++ 句法演化?
- c++ - 错误:无法转换 'std::__cxx11::string' {aka 'std::__cxx11::basic_string
'} 到 'const char*' 第 23 行 - javascript - 如何将道具动态发送到材质 UI 中的样式挂钩?
- html - 如何使 span 标签中的文本慢慢消失并与 CSS 缩小差距?
- python - 在求解三次方程时,如何将三次多项式除以线性多项式(Python 3)?
- scala - 如何从一个通用数据集中创建具有不同类类型的多个数据集?
- python - LightRun Python 代理错误:TypeError:只能将 str(不是“NoneType”)连接到 str
- python - tkinter python - 将一个小部件放置到右上角