我有两个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
字段创建一个新表,其列标题为Visit- n ,其中 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,然后循环遍历记录和列。至关重要的是,每行只有PersonID
,并且所有数据都按时间顺序显示在列中。
答案 0 :(得分:0)
通过使用
之类的内容对访问进行排名来开始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
使用此查询作为'pivot'的基础
由于您似乎在同一天访问了某些人(访问1和2),因此WHERE子句需要更复杂一些。但我希望你能得到基本的概念。
可以使用多个LEFT JOIN进行透视。 我怀疑我的解决方案是否具有高性能,因为我没有测试它。在SQL Server中比在MS Access中更容易完成。