2015-08-08 86 views
1

我试图使用Excel VBA使用SQL语句从访问数据库中提取记录。 使用Excel VBA和SQL SELECT语句我可以使用WHERE子句提取记录。 现在我正在尝试从我的数据库中选择记录的一对,但我不知道如何实现这一点。使用SQL从Access数据库中选择记录对

访问表:(注:有表中的其他列)

 Date DTE Name Sc 
    41668 AAA425 AdamJ 98 
    41669 ABC500 JohnB 85 
    41689 ADE450 AdamJ 56 
    41789 AFF350 AdamJ 74 

我想根据名称

选择对例如

Date DTE  Name Sc Date DTE  Name Sc 
41668 AAA425 AdamJ 98 41689 ADE450 AdamJ 56 
41668 AAA425 AdamJ 98 41789 AFF350 AdamJ 74 
41689 ADE450 AdamJ 56 41789 AFF350 AdamJ 74 

然后,我要过滤/基础上选择第一DTE

Date DTE  Name Sc Date DTE  Name Sc 
41668 AAA425 AdamJ 98 41689 ADE450 AdamJ 56 
41668 AAA425 AdamJ 98 41789 AFF350 AdamJ 74 

任何人都可以点我在正确的方向我怎么能做到这一点?

+0

访问表的主键是什么?哪个字段使记录独一无二? –

+0

您的第一个示例输出似乎表明您希望每个可能的对的每个可能的组合。我建议将记录集加载到变体数组和/或字典中,并在输出到工作表之前执行处理。 MS SQL可能有此机会与各种形式的分区表,但我不认为这是直接从MS Access可行。 – Jeeped

+0

基本上我想对每个测试(DTE)一次运行sc(测试分数)回归。 DTE = test,Name =学生姓名,Sc =考试分数。我意识到会有几千(几百万)对。我希望将匹配限制在某个日期(即日期之前)和/或对之间的日期差异<90的情况下。每个记录具有唯一的索引号。如果这样做更容易,我可以使用studentID而不是学生名称。 – anrichards22

回答

0

我不完全了解(或更多为什么)你想做的事,但你可以像这样做:

选择你的主驾驶记录:

select max(date), 
     name 
    from NameDates (or whatever you called your table) 
group by name; 

这样就给你每个人的最新记录。

现在加入的是同一个表中选择到另一个选择:

with mainName as 
(select max(date) as main_date, 
     name as main_name 
    from NameDates (or whatever you called your table) 
    group by name 
) 
select main_date, 
     main_name, 
     date, 
     name, 
     sc 
    from mainName, 
     NamesDates 
where main_name = name 
    and main_date != date; 

检查它在这里工作:

http://sqlfiddle.com/#!4/321b3/8

+0

此语法在访问中不起作用,但应在SQL Server中正常工作! (我喜欢sqlfiddle链接 - 非常有用 - 谢谢。我已经重新编写了你的​​SQL来访问SQL – HarveyFrench

+0

我不只想匹配第一个(最新)记录,我需要匹配1st和2nd ,第一个是第三个,第二个是第三个,等等等等等等很多匹配我试图对测试分数进行回归分析,看看不同测试的测试分数之间的关系在我的例子中,AAA425 = ADE450 + 42的测试分数。理论上我应该有很多匹配(数千甚至数百万),但是通过过滤每个DTE的匹配(测试,每次一个)会有<千分之一。我目前使用的是完全相同的东西Excel vba通过从我的表中提取数据集 – anrichards22

0

是的,这可以通过使用访问SQL像下面的访问来完成:

假设您的数据保存在表名称日期中。

select mainName.main_date, 
     mainName.main_name, 
     NamesDates.date, 
     NamesDates.name, 
     NamesDates.sc, 
     NamesDates.StudentID 
    from NamesDates 
     LEFT JOIN 
     (select max(date) as main_date, 
       StudentID AS main_StudentID 
      from NameDates 
      group by StudentID 
     ) AS mainName, 
     ON mainName.main_StudentID = NamesDates.StudentID 
where mainName.main_date != NamesDates.date; 

根据名称匹配记录的请求是不正常的,因为名称通常不是唯一的。通常和唯一的标识符将被用于将记录与创建的对进行匹配。

PS。我怀疑你将需要使用“最小(日期)”而不是“最大(日期)”

此外,它听起来像你需要在主要和子查询中添加一个WHERE子句,以限制日期为90天你提到的时期。

Harvey

+0

如果这样做更容易,我可以使用学生ID而不是名称 – anrichards22

+0

是的,您应该使用主键字段进行查找和尽可能加入 – HarveyFrench

+0

学生ID不是主键每个记录都有一个唯一标识符(索引号)。 DTE,Sc,姓名和日期是28列中的4个。 – anrichards22