Access交流中心

北京 | 上海 | 天津 | 重庆 | 广州 | 深圳 | 珠海 | 汕头 | 佛山 | 中山 | 东莞 | 南京 | 苏州 | 无锡 | 常州 | 南通 | 扬州 | 徐州 | 杭州 | 温州 | 宁波 | 台州 | 福州 | 厦门 | 泉州 | 龙岩 | 合肥 | 芜湖 | 成都 | 遂宁 | 长沙 | 株洲 | 湘潭 | 武汉 | 南昌 | 济南 | 青岛 | 烟台 | 潍坊 | 淄博 | 济宁 | 太原 | 郑州 | 石家庄 | 保定 | 唐山 | 西安 | 大连 | 沈阳 | 长春 | 昆明 | 兰州 | 哈尔滨 | 佳木斯 | 南宁 | 桂林 | 海口 | 贵阳 | 西宁 | 乌鲁木齐 | 包头 |

谁能详细告诉我这个查询是什么过程

舞空  发表于:2012-02-23 22:22:51  
复制

点击下载此附件

知道结果是获取销售数量大于该类商品销售总数平均值的商品,但是却不知道这个查询是什么原理。

以前知道as是给字段起别名的意思,这里的as a难道是虚构一个和销售明细一模一样的表?

既然是同类商品平均值,为何不见group by 语句?

 

Top
纵云梯 发表于:2012-02-24 09:48:49

点击下载此附件

 

SELECT * FROM 销售明细 AS a WHERE (((a.数量)>(select avg(数量) from 销售明细 where 商品编码=a.商品编码)));

是一个很好的自我对比查询例子,即某表的数据和自己的数据进行对比的查询,以下逐一解答和分析该查询。

1)“SELECT * FROM 销售明细 AS a“这一部分意为选择【销售明细】表里的所有记录并且把这个表从新定义为名字叫【a】的临时表。此时你的数据库里等于有【销售明细】和【a】两

个在数据内容和结构是完全一模一样的表。

2)“SELECT * FROM 销售明细 AS a“后面的“Where”是定义【a】这个临时表的数据范围,至于范围是什么其实并不重要,重要的是它有范围的概念。跟着我们分析这个”Where"后面

范围的具体意思。

3)首先我们把”(((a.数量)>(select avg(数量) from 销售明细 where 商品编码=a.商品编码)))“里多余的括号去掉,更换为“a.数量>(select avg(数量) from 销售明细 where 商品编码

=a.商品编码)”。“a.数量>”是指临时表【a】里的【数量】字段有大于某某数值才符合范围,至于这个某某数值范围是什么?我们一下再进行分析。

4)“(select avg(数量) from 销售明细 where 商品编码=a.商品编码)”其中的”select avg(数量) from 销售明细“意思是求【销售明细】表里【数量】字段的总平均值(没有Group By的范

围要求),但”where 商品编码=a.商品编码“对【销售明细】表里的数据已进行”where 商品编码=a.商品编码“的数据范围约束。下面我们再进行数据对比就更加明白了。

5)【销售明细】表里的数据:
id 报表编码 商品编码 数量
1 1101 101 1100  不大于 101为约束的【数量】字段数据平均值1800,所以不符合范围。
2 1101 102 300    不大于 102为约束的【数量】字段数据平均值300,所以不符合范围。
3 1102 103 1700  不大于 103为约束的【数量】字段数据平均值1850,所以不符合范围。
4 1103 104 500    不大于 104为约束的【数量】字段数据平均值600,所以不符合范围。
5 1104 101 2500  大于    101为约束的【数量】字段数据平均值1800,所以符合范围。
6 1105 103 2000  大于    103为约束的【数量】字段数据平均值1850,所以符合范围。
7 1105 104 700    大于    104为约束的【数量】字段数据平均值600,所以符合范围。

6)【查询2】(以【商品编码】为范围,求【销售明细】里【数量】字段的平均值)里的数据:
商品编码 数量OfAvg
101 1800
102 300
103 1850
104 600

7)【查询1】里的数据:
id 报表编码 商品编码 数量
5 1104 101 2500
6 1105 103 2000
7 1105 104 700

8)总结:”SELECT * FROM 销售明细 AS a WHERE (((a.数量)>(select avg(数量) from 销售明细 where 商品编码=a.商品编码)));“意思为找出【销售明细】表里【数量】字段大于以

自身【商品编码】字段为范围的【数量】平均值的记录。



舞空 发表于:2012-02-24 11:17:25
非常感谢楼上高手详细指点,可能是我天生愚钝,还是没弄明白。
没有“group by 商品编码”的“Avg(数量)”是1257.1428多呀!
“where 商品编码=a.商品编码”是不是“where 销售明细.商品编码=a.商品编码”?
既然a表和销售明细表一模一样,那里面的字段记录也一样,这句话不是多余么,删掉也不行?

舞空 发表于:2012-03-02 15:15:48

备忘:

 

还有人给我讲了好几种写法,我还是没明白,感觉常规access的书上都没有写这么详细

记录下来慢慢研究

 

select a.*
from 销售明细 as a,(select 商品编码 as a编码,avg(数量) as 平均数 from 销售明细 group by 商品编码)
where 商品编码=a编码 and 数量>平均数;

 

 

select a.* from
销售明细 AS a,(select avg(数量) as b_avg ,商品编码 from 销售明细 group by 商品编码) AS b
where a.商品编码=b.商品编码 and a.数量>b.b_avg;

 

 

select a.* from
销售明细 AS a inner join (select avg(数量) as b_avg ,商品编码 from 销售明细 group by 商品编码) AS b
on  a.商品编码=b.商品编码 and a.数量>b.b_avg



总记录:3篇  页次:1/1 9 1 :