访问 - 基于唯一键汇总表值?

时间:2016-06-03 17:11:43

标签: sql vba ms-access

我是Access的初学者。我有一个路由表,其中包括一个电缆托架列表,以及贯穿这些托盘的电缆。数据样本如下:

tray        Usable Area    cable                Total Cable Area (mm^2)
CM1001            25000    1-3/C-00AWG-Cu-TECK                  660.19
CM1001            25000     1-3/C-4AWG-Cu-TECK                  572.27
CM1001            25000    1-3/C-14AWG-Cu-TECK                  490.63
TC-100D.2         15600   1-3/C-750AWG-Al-TECK                1,017.36
TM-001.7B         72000   1-3/C-750AWG-Al-TECK                1,017.36
TM-001A.1         10000   1-3/C-750AWG-Al-TECK                1,017.36
TM-001A.2         90000     1-3/C-8AWG-Cu-TECK                  530.66
TM-001A.3         90000   1-3/C-750AWG-Al-TECK                1,017.36

托盘字段包含唯一值和重复值。重复值被认为是单个托盘,只有多种类型的电缆穿过它(在电缆列中)。 我的目标是总计单个托盘的总电缆面积,即使该托盘实际上是多个重复的条目。例如,托盘CM1001的总电缆面积为1723.06mm²,TM-001A.1为1017.36mm²,TM-001A.2为530.66mm²。然后,我将比较总电缆面积与托盘的可用区域,以查看托盘是否已满。

我的问题是:是否有某种简单的Access查询我可以运行以总结“电缆总区域”列中的值,如果有重复的“托盘”行,但只显示总电缆面积中的值是托盘是一个独特的行?创建此新查询时,可用区域和电缆字段最终并不重要。理想情况下,我的新查询看起来像:

tray              Total Cable Area (mm^2)
CM1001                           1,723.06
TC-100D.2                        1,017.36
TM-001.7B                        1,017.36
TM-001A.1                        1,017.36
TM-001A.2                          530.66
TM-001A.3                        1,017.36

如果没有某种我根本不知道的通用查询类型,您是否愿意提供一些关于如何使用VBA实现此目的的起点?我熟悉VBA,而不是Access。

非常感谢你!

2 个答案:

答案 0 :(得分:0)

您需要选择 tray列,Sum Total Cable Area (mm^2) tray

SELECT [Total Cable Area (mm^2)], SUM([tray]) AS [tray]
FROM [MyTable]
GROUP BY [Total Cable Area (mm^2)]

答案 1 :(得分:0)

我在VBA中编写了一个解决方案,但它将结果写入另一个表,这可能不是正确的形式。如果将来有人想要它,我会在下面加入它,但Mat的解决方案肯定更好。

Sub sum_duplicate_trays()

Dim rs_qry As DAO.Recordset
Dim rs_fill As DAO.Recordset
Set rs_qry = CurrentDb.OpenRecordset("qryCable_Area")
Set rs_fill = CurrentDb.OpenRecordset("tblTray_Fill")

'deletes contents on tblTray_Fill, since it will be replaced below.
DoCmd.SetWarnings False
DoCmd.RunSQL "DELETE * FROM tblTray_Fill"
DoCmd.SetWarnings True

If Not (rs_qry.EOF And rs_qry.BOF) Then
    rs_qry.MoveFirst
    Do Until rs_qry.EOF = True
        'sees if current tray already exists in Fill table (which contains only uniques)
         rs_fill.Index = "tray"
         rs_fill.Seek "=", rs_qry!tray
            If rs_fill.NoMatch Then
               rs_fill.AddNew
               rs_fill!tray = rs_qry!tray
               rs_fill!cable_area = rs_qry![Total Cable Area (mm^2)]
               rs_fill.Update
            Else 'already existing
               rs_fill.Edit
               rs_fill!cable_area = rs_fill!cable_area + rs_qry![Total Cable Area (mm^2)]
               rs_fill.Update
            End If
        rs_qry.MoveNext
    Loop
Else
    MsgBox "Error: the Cable Area query is empty."
End If
End Sub