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

问题描述

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

查询 1

BldID UnitID 居民身份证
1 201 约翰·史密斯
1 201 简·多伊
1 202 丹尼尔·琼斯
1 202 马克·加西亚
2 201 玛丽亚·李
2 201 保罗·威廉姆斯
2 201 迈克琼斯

已编辑查询的期望输出

BldID UnitID Res1 Res2 Res3
1 201 约翰·史密斯 简·多伊
1 202 丹尼尔·琼斯 马克·加西亚
2 201 玛丽亚·李 保罗·威廉姆斯 迈克琼斯

解决方法

您可以使用交叉表查询

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,"BldID=" & [BldID] & 
       " AND UnitID=" & [UnitID] &
       " AND ResidentID<'" & [ResidentID] & "'") + 1

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

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