Microsoft Access 基于匹配值的数据新列

Microsoft Access new columns for data based on matching values

几个月前我问过这个问题,但现在我正在使用 MS-Access,我不确定如何继续。我有一个查询,在单独的列中列出了 bldid、unitid 和驻留 ID。我想修改 Microsoft Access 中的查询输出,以便共享建筑物/单元的每个居民都显示为同一行上的新列,如下所示。但由于我仅限于 MS Access,所以我似乎无法使用 with、cte 或 rownumber。我不知道如何做到这一点,所以任何帮助将不胜感激。

查询 1

BldID UnitID ResidentID
1 201 John Smith
1 201 Jane Doe
1 202 Daniel Jones
1 202 Mark Garcia
2 201 Maria Lee
2 201 Paul Williams
2 201 Mike Jones

已编辑查询的期望输出

BldID UnitID Res1 Res2 Res3
1 201 John Smith Jane Doe
1 202 Daniel Jones Mark Garcia
2 201 Maria Lee Paul Williams Mike Jones

您可以使用交叉表查询

TRANSFORM Max(Resident.ResidentID) AS MaxOfResidentID
SELECT Resident.BldID, Resident.UnitID
FROM Resident
GROUP BY Resident.BldID, Resident.UnitID
ORDER BY Resident.BldID, Resident.UnitID
PIVOT "Res" & (DCount("*",
               "Resident",
               "BldID=" & [BldID] & " AND UnitID=" & [UnitID] &
               " AND ResidentID<'" & [ResidentID] & "'") + 1);

如果您需要固定数量的列(例如,如果您想要创建一个 Access 报告),那么您可以向该查询添加一个 In 子句(在 ; 之前):

In ("Res1","Res2","Res3","Res4","Res5","Res6")

这总是创建 6 个具有相同名称的列。

难点在于获取每个 BldID/UnitID 组的行号。这是通过

实现的
DCount(1,
       "Resident",
       "BldID=" & [BldID] & 
       " AND UnitID=" & [UnitID] &
       " AND ResidentID<'" & [ResidentID] & "'") + 1

其中 Resident 是您的 table 或查询的名称。它计算 BldIDUnitID 相同但 ResidentID 较小的居民。将 1 添加到此计数会产生从 1 开始的行号。然后字符串 "Res" 被添加到前面以构建列名称。

请注意,居民是按字母顺序从左到右列出的。