【问题标题】:Microsoft Access new columns for data based on matching valuesMicrosoft Access 基于匹配值的数据新列
【发布时间】:2021-05-26 15:16:19
【问题描述】:

几个月前我问过这个问题,但现在我正在使用 MS-Access,我不确定如何继续。我有一个查询,在单独的列中列出了 bldid、unitid 和 resident 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

【问题讨论】:

标签: ms-access multiple-columns ms-access-2016


【解决方案1】:

您可以使用交叉表查询

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);

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

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

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

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

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

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

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

【讨论】:

  • 感谢您的详细示例。我只需要解决几个问题就可以解决这个问题。我确实有一个问题,如果 BldID 或 UnitID 是一个短文本字段而不是数字字段,我将如何调整 Dcount 来处理它?
  • 在 SQL 中,字符串用单引号括起来。您必须将它们都用单引号括起来,就像我在 DCount 函数中为 ResidentID 所做的那样。 "BldID='" &amp; [BldID] &amp; "' AND UnitID='" &amp; [UnitID] &amp; "' AND ResidentID&lt;'" &amp; [ResidentID] &amp; "'"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-30
  • 2022-11-13
  • 2022-11-22
  • 1970-01-01
相关资源
最近更新 更多