设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 1386|回复: 9
打印 上一主题 下一主题

[Access本身] 求教一个自连接并分组查询的问题。

[复制链接]
跳转到指定楼层
1#
发表于 2016-6-17 10:51:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
有一张表,有三个字段:姓名,日期,成绩。欲得到按日期列单每一个学生的最新成绩。比如:

姓名   日期         成绩
丙       3月5日    98
甲       3月10日  72
丁       3月10日  85
丁       3月24日  90
乙       3月24日  88
甲       4月13日  68


得到的结果应该是:

日期         姓名    成绩
3月5日     丙       98
3月10日   甲       72
3月10日   丙       98
3月10日   丁       85
3月24日   甲       72
3月24日   乙       88
3月24日   丙       98
3月24日   丁       90
4月13日   甲       68
4月13日   乙       88
4月13日    丙      98
4月13日    丁      90

在SQL Server这是没问题的,但在Access的SQL里,查询语句不知道怎么写。谢谢了!

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
2#
发表于 2016-6-17 11:18:14 | 只看该作者
sql server应该也是写游标或者存储过程的吧?
Access虽然没有这两个组件,不过ado也可以实现,只是复杂些。大体思路如下:
1、建一个表(即目标表)用于存储数据。
2、创建一个日期变量,设置为一个最小的日期,例如:1900-1-1
3、创建记录集,条件为:源数据的日期大于该日期(1900-1-1)的最小值。大体语句如下:
  1. SELECT Min(日期) AS 最近日期, 姓名,成绩
  2. FROM 表
  3. GROUP BY 姓名,成绩
  4. HAVING (Min(日期)>#1/1/1900#;
复制代码

4、由3得到第一条记录,追加到目标表,并记录日期。
5、继续执行3、4直至记录为空。
------------------------------------------
不过实话说,我没理解这样做的目的在哪里。事实上,用max(或者last)日期,group by姓名,成绩应该就可以出最近4条记录了。

PS:我一般只写函数,懒得做附件。
3#
 楼主| 发表于 2016-6-17 11:25:33 | 只看该作者
就是在日期列单上统计每个学生的最近的成绩。用一条查询语句不能做吗?思路应该的自连接加按姓名的分组查询,自连接的On应该是小于等于……。但我试过,Access太特殊。
4#
发表于 2016-6-17 11:31:00 | 只看该作者
secondonsite 发表于 2016-6-17 11:25
就是在日期列单上统计每个学生的最近的成绩。用一条查询语句不能做吗?思路应该的自连接加按姓名的分组查询 ...

只能查4条。没法更新那么多数据。
——联合查询除外。
5#
 楼主| 发表于 2016-6-17 11:41:34 | 只看该作者
roych 发表于 2016-6-17 11:31
只能查4条。没法更新那么多数据。
——联合查询除外。

联合查询怎么做吧?谢谢!

点击这里给我发消息

6#
发表于 2016-6-17 12:09:36 | 只看该作者
联合查询: 查询语句 Union 查询语句
7#
发表于 2016-6-17 12:13:31 | 只看该作者
secondonsite 发表于 2016-6-17 11:41
联合查询怎么做吧?谢谢!

先创建多个查询:
查询1:
select frist(姓名) as 姓名1,min(日期) as 日期1,frist(成绩) as 成绩1 from 成绩表
查询2:
select 姓名,min(日期) as 日期2,成绩 from 成绩表 left join 查询1 on 日期=日期1
group by 成绩,姓名 having min(日期)>日期1
查询3:
select 姓名1,iif([日期1]<(select distinct 日期2 from 查询2),(select distinct 日期2 from 查询2),[日期1]) as 新日期1,成绩1 from 查询1
…………
接下来先联合查询1,2,3得到4条记录:
select * from 查询1
union all
select * from 查询2
union allselect * from 查询3
………………………………
额,估计得创建十几个或者几十个查询吧。

我的建议是,要么用max或者last得到4条记录;要么用ADO逐条追加上去。
另外,这种补全记录的玩法用Excel比Access要好很多。反正就写一个数组公式什么的拖啊拖就好了。
8#
 楼主| 发表于 2016-6-17 12:16:38 | 只看该作者
思路我有,现在就是要得到具体语句。
9#
 楼主| 发表于 2016-6-17 12:20:20 | 只看该作者
应该是自连接。这个表 As A和As B. A和BInner Join连接,其中一个表按姓名分组,函数用Max(日期)。On部分应该是两个日期小于等于。具体写出来语法不对。请Access SQL高手写出具体的语句。
10#
发表于 2016-6-20 11:20:53 | 只看该作者
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-5-13 20:07 , Processed in 0.103305 second(s), 33 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表