根据日期从两个表创建数据透视表

时间:2013-09-05 02:07:03

标签: sql vba ms-access dao

我有两个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,并且所有数据都按时间顺序显示在列中。

1 个答案:

答案 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中更容易完成。