2016-06-03 3 views
0

Я новичок для доступа. У меня есть таблица маршрутизации, которая включает в себя список кабельных лотков, а также кабели, которые проходят через эти лотки. Образец данных выглядит следующим образом:Доступ - суммирование значений таблиц на основе уникальных ключей?

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,06 мм², TM-001A.1 составляет 1017,36 мм², а TM-001A.2 составляет 530,66 мм². Затем я сравню эту общую площадь кабеля с полезной областью лотка, чтобы узнать, заполнен ли лоток.

Мой вопрос: есть ли какой-нибудь простой запрос доступа. Я могу выполнить подсчет значений в столбце «Общая площадь», если есть повторяющиеся строки «лоток», но просто отобразить значение в Total Cable Area - это лоток - уникальный ряд? Полезные области и кабельные поля в конечном итоге неважны при создании этого нового запроса. В идеале, мой новый запрос будет выглядеть следующим образом:

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.

Большое вам спасибо!

ответ

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)] 
+0

Спасибо! Пока я ждал ответа, я понял, что могу написать его в VBA, который я включу в другой ответ, если кто-то в будущем этого захочет. Код VBA заканчивается тем, что записывает результаты в другую таблицу, и я понимаю, что это не совсем правильная форма. Я определенно использую ваше решение для своей элегантности. Еще раз спасибо! –

+0

Операции сложениями всегда лучше всего обрабатываются с помощью SQL - * это то, что делает SQL! * Итеративные/кодовые подходы медленнее, сложнее и подвержены ошибкам. –

0

Я написал решение в VBA, но он записывает результаты в другую таблицу, которая может быть неправильной. Я включил его ниже, если кто-то в будущем этого захочет, но решение Мата определенно лучше.

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