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 或查询的名称。它计算 BldID
和 UnitID
相同但 ResidentID
较小的居民。将 1 添加到此计数会产生从 1 开始的行号。然后字符串 "Res"
被添加到前面以构建列名称。
请注意,居民是按字母顺序从左到右列出的。
几个月前我问过这个问题,但现在我正在使用 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 或查询的名称。它计算 BldID
和 UnitID
相同但 ResidentID
较小的居民。将 1 添加到此计数会产生从 1 开始的行号。然后字符串 "Res"
被添加到前面以构建列名称。
请注意,居民是按字母顺序从左到右列出的。