访问具有相同 ID 但在其他 2 列中具有不同值的选择行

Posted

技术标签:

【中文标题】访问具有相同 ID 但在其他 2 列中具有不同值的选择行【英文标题】:Access select rows with same ID but different values in 2 other columns 【发布时间】:2014-04-10 07:24:42 【问题描述】:

我在 Access 2007 中有下表:

Route   Cust    Planners
4401    1004    jasper
4401    1005    onno
4401    1006    jasper
4402    1007    bart
4402    1008    marcel
4402    1059    onno
4403    1124    bart
4403    1165    marcel
4403    1198    marcel
4403    1201    mustafa
4403    1225    bart
4401    1178    maurice

我想要这个结果(所有客户和所有规划者一起拥有相同的路线):

Route   Cust                      Planners
4401    1004;1006;1178;1005       jasper;maurice;onno
4402    1007;1008;1059            bart;marcel;onno
4403    1124;1225;1165;1198;1201  mustafa;marcel;bart 

这可能是通过查询还是仅通过 VBA 代码? 提前致谢!

编辑@Dan(已解决): 感谢您的步骤,我有做这样的事情的想法,但不知道具体如何。 在对我有用的代码下方(它可能更容易完成,代码更少,但它可以完成工作)

Dim rs As DAO.Recordset
Dim cust, planners As String
Dim route, route2, cntr As Integer

DoCmd.RunSQL "Delete * FROM details2"

Set rs = CurrentDb.OpenRecordset("select * from details order by route, cust")

rs.MoveFirst
cntr = 0
Do While Not rs.EOF
    route = rs.Fields("Route")
    'If route readed from recordset is not the same as local variable then insert that route and give local variable the new route and clear cust and planners
    If route <> route2 Then
        'If going through loop for first time => do no insert
        If cntr > 0 Then
            'Delete last comma for both cust and planners field and insert that route
            cust = Left(cust, Len(cust) - 1)
            planners = Left(planners, Len(planners) - 1)
            DoCmd.RunSQL "insert into details2 (Route, Cust, Planners) Values (" & route2 & ", '" & cust & "', '" & planners & "')"
        End If
        route2 = route
        cust = ""
        planners = ""
    End If

    'If route readed is the same as local variable, add cust and planner to the string but only if it isn't in the string already
    If route = route2 Then
        If InStr(cust, CStr(rs.Fields("cust"))) = 0 Then cust = cust + CStr(rs.Fields("cust")) & ","
        If InStr(planners, rs.Fields("planners")) = 0 Then planners = planners + rs.Fields("planners") & ","
    End If
    rs.MoveNext
    cntr = cntr + 1
Loop

'Delete last comma for cust and planners field and add last route
cust = Left(cust, Len(cust) - 1)
planners = Left(planners, Len(planners) - 1)
DoCmd.RunSQL "insert into details2 (Route, Cust, Planners) Values (" & route2 & ", '" & cust & "', '" & planners & "')"

这给了我以下结果:

Route   Cust                        Planners
4401    1004,1005,1006,1178         jasper,onno,maurice
4402    1007,1008,1059              bart,marcel,onno
4403    1124,1165,1198,1201,1225    bart,marcel,mustafa

非常感谢!

【问题讨论】:

我怀疑你真的想要用分号分隔的值列表;您不能使用简单的“从任何 ORDER BY Route 中选择 Route、Cust、Planners”,每个 Route 的所有数据都在连续的行中,然后一次处理一行,将单独的 Cust 和 Planners 值收集到适当的数据中结构没有繁琐的解析? @LorenzoGatti:如果结果用于报告输出怎么办?在这种情况下,将字符串连接到组上是非常有意义的,这样可以让最终用户对给定路线的 Cust 和 Planner 有一个快速而紧凑的概览。 @LorenzoGatti:嗯,它不一定是分号,可以是逗号。但是如何在查询中一次处理一行? @Dan:是的,没错。只是为了更快地查看特定路线的客户和计划者 【参考方案1】:

虽然 Access SQL 本身没有任何方法将字符串连接作为组的聚合执行,但您当然可以使用 SQL 和 VBA 的组合来实现。

我不能给你实际的代码,但想法是这样的:

    创建一个新表来保存您的输出。确保您的 Cust 和 Planners 列足够长。 在 VBA 中,创建一个变量来存储路由号。将其初始化为 0 或其他未出现在数据库中的值。还为 Cust 和 Planners 创建字符串变量。将它们初始化为空字符串。 打开一个按路由排序的记录集,和iterate through all records。 对于每条记录,检查 Route 列的值是否等于 Route 变量中存储的值。 如果值相同,请将 Cust 和 Planners 列的值添加(连接)到它们各自的变量中。 如果 Route 列值与 Route 变量值不同,insert a new record in your output table 与您的变量的当前值相同。重置 Cust 和 Planners 变量,并分配当前记录中的值。将新的 Route 列值分配给您的 Route 变量。 继续迭代。 迭代完成后,对输出表执行最后一次插入。输出表现在应该包含您要查找的结果。

【讨论】:

谢谢你,我用工作代码编辑了我的帖子 干得好!你的代码看起来很棒。很高兴能帮上忙:-)【参考方案2】:

您必须创建一个 VBA 函数。然后使用下面的查询。

Here is the Source link

SELECT CompanyName,  ConcatRelated("Cust", "Table_name", "Route= " & [Route]) 
FROM Table_name;

【讨论】:

感谢您的帮助,这与 Dan 告诉我的有点相似,但我只是使用了一个按钮来编写代码,因为我发现这对我来说更容易

以上是关于访问具有相同 ID 但在其他 2 列中具有不同值的选择行的主要内容,如果未能解决你的问题,请参考以下文章

查找一列中具有相同值而另一列中具有其他值的行?

SQL 选择以消除在下一列中具有 2 个其他值的重复值

如何合并列中具有相同值的两个表

Power BI:将项目分组在一列中,具有不同值的其他列显示为几列

我不能在列中添加具有 2 个相同值的行

如果数组列中有多条具有相同值的记录 - 取一条具有另一列最小值的记录