Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SQL从Access数据库中选择记录对_Sql_Excel_Vba_Ms Access - Fatal编程技术网

使用SQL从Access数据库中选择记录对

使用SQL从Access数据库中选择记录对,sql,excel,vba,ms-access,Sql,Excel,Vba,Ms Access,我正在尝试使用Excel VBA和SQL语句从access数据库中提取记录。 使用Excel VBA和SQL SELECT语句,我可以使用WHERE子句提取记录。 现在我正在尝试从数据库中选择成对的记录,但我不确定如何实现这一点 访问表:(注意:表中还有其他列) 我想根据姓名选择配对 例如 然后我想根据第一个DTE进行过滤/选择 Date DTE Name Sc Date DTE Name Sc 41668 AAA425 AdamJ 98 41689 AD

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

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

我想根据姓名选择配对

例如

然后我想根据第一个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

有谁能给我指出正确的方向,告诉我如何实现这一目标吗?

我不完全理解你想做什么(或者为什么),但你可以用这样的方法来实现:

选择您的主要驾驶记录:

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;
检查它是否在这里工作:


我不完全理解您想做什么(或为什么),但您可以通过以下方式来完成:

选择您的主要驾驶记录:

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;
检查它是否在这里工作:


是的,使用ACCESS 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;
根据名称匹配记录的请求并不常见,因为名称通常不唯一。通常情况下,人员的唯一标识符将用于将记录与创建的配对进行匹配

注:我怀疑您需要使用“最小(日期)”而不是“最大(日期)”

此外,听起来您需要在主查询和子查询上添加WHERE子句,以将日期限制在您提到的90天期限内


Harvey

是的,这可以通过使用ACCESS 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;
根据名称匹配记录的请求并不常见,因为名称通常不唯一。通常情况下,人员的唯一标识符将用于将记录与创建的配对进行匹配

注:我怀疑您需要使用“最小(日期)”而不是“最大(日期)”

此外,听起来您需要在主查询和子查询上添加WHERE子句,以将日期限制在您提到的90天期限内


Harvey

访问表的主键是什么?哪个字段使记录唯一?您的第一个示例输出似乎表明您需要每个可能对的每个可能组合。我建议将记录集加载到变量数组和/或字典中,并在输出到工作表之前在其中执行处理。MS SQL可能有机会使用各种形式的分区表实现这一点,但我不认为直接从MS Access实现这一点是可行的。基本上,我希望每次对每个测试(DTE)的sc(测试分数)进行回归。DTE=测试,姓名=学生姓名,Sc=测试分数。我意识到将会有成千上万对。我希望将匹配限制在某个日期段(即日期之前)和/或配对之间的日期差<90。每个记录都有一个唯一的索引号。如果方便的话,我可以用studentID代替student name。Access表的主键是什么?哪个字段使记录唯一?您的第一个示例输出似乎表明您需要每个可能对的每个可能组合。我建议将记录集加载到变量数组和/或字典中,并在输出到工作表之前在其中执行处理。MS SQL可能有机会使用各种形式的分区表实现这一点,但我不认为直接从MS Access实现这一点是可行的。基本上,我希望每次对每个测试(DTE)的sc(测试分数)进行回归。DTE=测试,姓名=学生姓名,Sc=测试分数。我意识到将会有成千上万对。我希望将匹配限制在某个日期段(即日期之前)和/或配对之间的日期差<90。每个记录都有一个唯一的索引号。如果方便的话,我可以使用studentID而不是student name。这种语法在access中不起作用,但在SQL Server中应该起作用。OK!(我喜欢sqlfiddle链接-非常有用-谢谢。我已经将您的SQL编写为access SQLI,我不只是想与第一个(最新的)匹配)记录。我需要将第1个与第2个、第1个与第3个、第2个与第3个等进行匹配。因此有很多匹配。我正在尝试对测试分数进行回归,以查看不同测试的测试分数之间的关系。在我的示例中,AAA425的测试分数=ADE450+42的测试分数。理论上我应该有很多匹配项(数千,甚至数百万)但通过筛选每个DTE的匹配项(测试,一次一个),将有<千。我目前使用Excel vba从我的表中提取数据集来做完全相同的事情。此语法在access中不起作用,但在SQL Server中应该起作用。OK!(我喜欢sqlfiddle链接-非常有用-谢谢。我已经将您的SQL编写为access SQLI,我不只是想与第一个(最新的)匹配)记录。我需要将第1个与第2个、第1个与第3个、第2个与第3个等进行匹配。因此有很多匹配。我正在尝试对测试分数进行回归,以查看不同测试的测试分数之间的关系。在我的示例中,AAA425的测试分数=ADE450+42的测试分数。理论上我应该有很多匹配项(数千,甚至数百万)但通过过滤每个DTE的匹配项(测试,一次一个)将有<千个。我目前使用Excel vba从我的表中提取数据集,执行完全相同的操作。如果方便的话,我可以使用学生ID而不是名称。是的,您应该尽可能使用主键字段进行查找和联接。学生ID不是主键。每条记录都有一个唯一的标识符(索引号).DTE、Sc、名称和日期