2015-08-08 2 views
1

Я пытаюсь извлечь записи из базы данных доступа с помощью Excel VBA с помощью оператора SQL. Используя Excel VBA с оператором SQL SELECT, я могу извлечь записи, используя предложение WHERE. Теперь я пытаюсь выбрать PAIRS записей из моей базы данных, но я не уверен, как я могу это достичь.Использование SQL для выбора пар записей из базы данных доступа

Таблица доступа: (NB: есть и другие столбцы в таблице)

 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 

Тогда я хочу, чтобы фильтровать/выбрать на основе первого ООД

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

В принципе, я хочу выполнить регрессию по sc (тестовые оценки) для каждого теста (DTE) по одному за раз. DTE = test, Name = имя студента, Sc = Test score. Я понимаю, что будут буквально тысячи (миллионы) пар.Я хотел бы ограничить совпадения до определенного периода времени (то есть до даты) и/или где разница дат между парами составляет <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 OK! (Мне нравится ссылка sqlfiddle - очень полезно - спасибо. Я переписал ваш SQL для доступа к SQL. – HarveyFrench

+0

Я не просто хочу соответствовать первой (последней) записи. Мне нужно сопоставить первое со вторым , 1-й с 3-го, 2-й с 3-го и т. д. и т. д. Так много совпадений. Я пытаюсь запустить регрессию на тестовых оценках, чтобы увидеть взаимосвязь между результатами тестов для разных тестов. В моем примере тестовая оценка для AAA425 = оценка теста для ADE450 + 42. Теоретически у меня должно быть много матчей (тысячи, даже миллионы), но путем фильтрации совпадений для каждого DTE (тест, по одному за раз) будет <тыс. В настоящее время я делаю то же самое, используя Excel vba, извлекая набор данных из моей таблицы. – anrichards22

0

Да это можно сделать доступ с помощью Access SQL, как следующее :

Предполагая, что ваши данные хранятся в таблице NamesDates.

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. Я подозреваю, что вам нужно будет использовать «min (date)« not »max (date)»

Также похоже, что вам нужно добавить предложение WHERE как для основного, так и для подзапросов, чтобы ограничить даты до 90 дней период, который вы упоминаете.

Harvey

+0

Я могу использовать идентификатор студента вместо имени, если это облегчает его. – anrichards22

+0

Да, вы должны использовать поле первичного ключа для поиска и объединения, где это возможно. – HarveyFrench

+0

Идентификатор студента НЕ является основным ключом Каждая запись имеет уникальный идентификатор (индексный номер). DTE, Sc, Name и Date - 4 из 28 столбцов. – anrichards22

Смежные вопросы