Создать сводную таблицу из двух таблиц на основе дат
У меня есть две таблицы MS Access, разделяющие отношения один ко многим. Их структуры похожи на следующие:
tbl_Persons
+----------+------------+-----------+
| PersonID | PersonName | OtherData |
+----------+------------+-----------+
| 1 | PersonA | etc. |
| 2 | PersonB | |
| 3 | PersonC | |
tbl_Visits
+----------+------------+------------+-----------------------
| VisitID | PersonID | VisitDate | dozens of other fields
+----------+------------+------------+-----------
| 1 | 1 | 09/01/13 |
| 2 | 1 | 09/02/13 |
| 3 | 2 | 09/03/13 |
| 4 | 2 | 09/04/13 | etc...
Я хочу создать новую таблицу на основе VisitDate
поле, заголовки столбцов которого: посещение, где n равно 1 для количества посещений, посещение n- Data1, посещение n- Data2, посещение n- Data3 и т. д.
MergedTable
+----------+----------+---------------+-----------------+----------+----------------+
| PersonID | Visit1 | Visit1Data1 | Visit1Data2... | Visit2 | Visit2Data1... |
+----------+----------+---------------+-----------
| 1 | 09/01/13 | | | 09/02/13 |
| 2 | 09/03/13 | | | 09/04/13 |
| 3 | etc. | |
Я действительно не уверен, как это сделать. Будь то SQL-запрос или использование DAO, циклически просматривая записи и столбцы. Важно, что есть только 1 PersonID
за строку, и все его данные отображаются в хронологическом порядке в столбцах.
1 ответ
Начните с рейтинга посещений с чем-то вроде
SELECT PersonID, VisitID,
(SELECT COUNT(VisitID) FROM tbl_Visits AS C
WHERE C.PersonID = tbl_Visits.PersonID
AND C.VisitDate < tbl_Visits.VisitDate) AS RankNumber
FROM tbl_Visits
Используйте этот запрос в качестве основы для "пивота"
Поскольку вы, кажется, несколько раз посещали людей в один и тот же день (посещения 1 и 2), предложение WHERE должно быть немного более сложным. Но я надеюсь, что вы получите основную концепцию.
Поворот может быть сделан с несколькими левыми соединениями. Я спрашиваю, будет ли мое решение иметь высокую производительность, поскольку я его не тестировал. В SQL Server это проще, чем в MS Access.