Я использую этот код VBA для заполнения RowSource таблицы данных в MSAccess данными, полученными из запроса SQL в базе данных.
Этот конкретный запрос должен быть относительно простым и эффективным. По сути, необходимо сложить все точки для имени пользователя между двумя датами и показать общее количество рядом с их именем. Проблема, которая делает этот комплекс, заключается в необходимости показывать нули.
В нынешнем виде код выглядит так:
.subProdSheet_table.Form.RecordSource = " SELECT adj.TM_StaffName AS Staff_Name, Nz(Sum(ps.PS_Points+ps.PS_AdhocPts),0) AS [Total Points] " & _
" FROM [ODBC;DRIVER=SQL Server;SERVER=<REDACTED>;Trusted_Connection=Yes;DATABASE=<REDACTED>].dbo.SD_StaffMembers as adj " & _
" LEFT JOIN [ODBC;DRIVER=SQL Server;SERVER=<REDACTED>;Trusted_Connection=Yes;DATABASE=<REDACTED>].dbo.PS_DB as ps ON (((cstr(adj.TM_StaffMember) = cstr(ps.PS_StaffMember)) AND cdate(ps.PS_Date) >= #" & getNextWeek_Start & "#) AND cdate(ps.PS_Date) <= #" & getNextWeek_End & "#) " & _
" WHERE adj.TM_TeamName = '" & tmName & "' " & _
" GROUP BY adj.TM_StaffMember; "
Заполняет таблицу, которая выглядит следующим образом:
+--------------+--------------+
| Staff Member | Total Points |
+--------------+--------------+
| John A | 11.25 |
| John B | 7.75 |
| John C | 14 |
| John D | 13 |
| John E | 14.25 |
| John F | 14 |
| John G | 5.75 |
| John H | 6 |
| John J | 10.5 |
| John K | 2 |
| John L | 0 |
| John M | 9.75 |
+--------------+--------------+
Ключевая часть в том, что он показывает Джона Л как ноль. Я мог бы написать гораздо менее сложную версию этого, которая использовала бы одну таблицу для их прямого суммирования, и производительность была бы отличной; будет рассчитывать почти мгновенно. Но для того, чтобы получить полный список сотрудников (и их общее число, равное нулю, если они не ввели данные), я должен написать это следующим образом.
Есть ли более эффективный способ написания запроса? Или я так связываюсь с базой данных SQLServer?
Есть ли лучший способ вернуть эти данные в источник строк более эффективным способом?