Access交流中心

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

[5分]高难度分组统计查询

Chen  发表于:2009-10-12 13:40:14  
复制

有表1(地址),表2(区),能否用一句代码查询每个区的地址的数量

PS:

1.由于地址填写不规范,并不是完全按照“市+区+详细地址”的格式录入的,所以只能用“地址 like '*区名*'”来区分该地址属于哪个区

2.有些地址中不包含区名,这类地址可归为其他

 

Top
Chen 发表于:2009-10-12 13:50:56

就是要把表1中的地址按表2中的区分类统计

之前用的笨方法是一个区一个区滴查,假如有n个区,就是:

select count(*) from 表1 where 地址 like '*区1*'
select count(*) from 表1 where 地址 like '*区2*'
……

select count(*) from 表1 where 地址 like '*区n*'

这样要查n次,是否能用一句代码代替呢?



符鸿敏 发表于:2009-10-12 16:59:07
请上传你的附件

andymark 发表于:2009-10-12 20:36:11

先处理规范表1的数据,并增加一个区域名称

再用一条语句统计可以了

select 区域,count(*)

from 表1

group by 区域

 

没有表结构和相关数据,这里也只是纸上谈兵,只能说一下思路

 

 

 

 

 

 

 

 



金矢 发表于:2009-10-13 07:50:22

是否这么个意思:



andymark 发表于:2009-10-13 08:10:56

是的

 

按实际修改上面的代码

 

只统计区就不须加地址



金矢 发表于:2009-10-13 08:59:39

建第一个查询,名为“表1查询”,其Sql语句如下

SELECT 表1.地址, (Select 区 From 表2 Where InStr([地址], [区])>0) AS 区划, IIf([区划] Is Null,"其他",[区划]) AS 区, DCount("区","表1查询","区='" & [区] & "'") AS 统计
FROM 表1;
再建第二个查询其Sql语句如下

SELECT 表1查询.区, 表1查询.统计
FROM 表1查询
GROUP BY 表1查询.区, 表1查询.统计
ORDER BY 表1查询.区;

 

电子表后效果如下图:


 



金矢 发表于:2009-10-13 09:05:43

修正一下我在6楼的方法如下:

建第一个查询名为“表1查询”Sql语句如下:

SELECT 表1.地址, (Select 区 From 表2 Where InStr([地址], [区])>0) AS 区划, IIf([区划] Is Null,"其他",[区划]) AS 区
FROM 表1;

建第二个查询名随意,Sql语句如下:

SELECT 表1查询.区, Count(表1查询.区) AS 统计
FROM 表1查询
GROUP BY 表1查询.区
ORDER BY 表1查询.区;

 

这样速度会更快。



金矢 发表于:2009-10-13 12:51:03

最后回复1楼:

给你一个最终的样库实例,可一步查询实现所要效果:

 

点击下载此附件

 

查询效果如下图示:



Chen 发表于:2009-10-13 14:50:01

8楼的效果就是我想要的,感谢koutx,太高了!有点看不懂:

SELECT t1.区, Count(t1.区) AS 统计
FROM [SELECT 表1.地址, (Select 区 From 表2 Where InStr([地址], [区])>0) AS 区划, IIf([区划] Is Null,"其他",[区划]) AS 区 FROM 表1]. AS t1
GROUP BY t1.区
ORDER BY t1.区

弱弱滴问一句,AS t1前为什么必须有个".",我删掉后就出错了。还有,能解释一下这个查询执行的顺序吗?



点燃一支烟 发表于:2009-10-13 15:17:23

呵呵,如果严格地讲,用like或InStr提取也是有局限的,也有不遂人愿的地方,但愿你的库里的实际记录不会遇到这种情况:怎么说呢?打个比方吧,有个笑话是:老师要小学生用“如果”造句,他造的是“苹果不如果子酱好吃”,你说这是用“如果”造句吗?同理,对于“西城"区而言,如果有个“山西城东杂货铺”,你看看它绝对属于“西城”区,呵呵,不过,这是多话了,先这么干吧。



金矢 发表于:2009-10-13 16:18:06

说实话,如果系新建数据库,我相信谁也不会采取这种表结构。在表2中加一"区ID"主键,表1中加一ID外键对应,即严密还省却了在表1地址中录入有关区的字词、及随后的逐多处理麻烦。估计楼主是要处理已有的库表或是Excel表等内的数据。如果确实象楼上所说的乌龙数据太多,那可就麻烦唠。

至于楼主在9楼的问题,可如下解释:

[SELECT 表1.地址, (Select 区 From 表2 Where InStr([地址], [区])>0) AS 区划, IIf([区划] Is Null,"其他",[区划]) AS 区 FROM 表1]. AS t1
当然是先执行[]中的语句了,并把它当作一个查询(或者是表)起个别名叫t1吧。

 

将骨架表示如下就容易明白了:

SELECT t1.区, Count(t1.区) AS 统计 FROM t1 GROUP BY t1.区 ORDER BY t1.区;



金矢 发表于:2009-10-14 14:42:06
楼主该散分了吧?哈哈

Chen 发表于:2009-10-15 13:53:27

谢谢各位!不好意思,昨天没上网,再次感谢koutx

dengshaobin思维很严谨,提醒了我,但是我的数据是上海的地址,不大会出现那种情况



金矢 发表于:2009-10-15 14:49:24
谢谢楼主的分,又有钱花了。

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