Страницы: 1
RSS
SQL: получить все строки таблицы с количеством значений по определённому полю
 
Вопрос не совсем по Excel.
В VBA запросом к таблице получаю данные, потом обработка данных и на лист Excel. Хотелось бы больше обработки возложить на SQL, т.к. на листе Excel процесс сильнее тормозит, а полученный в VBA  из результата запроса массив может быть большой и вплоть до нехватки памяти.
Таблица с code и id. Значения code уникальные, id - нет. Из таблицы надо получить все строки и количество одинаковых id по каждому code.
Пока у меня получаются данные только с одним (последним) code по каждому id.
Проблема ещё в том, в для данной таблицы и провайдера не работают вложенные запросы. Но JOIN и UNION - работают, хотя и с ними не получилось.
Возможно, решение простое, но сам никак не соображу.
Пример таблицы для простоты - в Excel.
 
Код
select t2.*, t1.countID from (select count(*) as countID,id from table group by id) t1 inner join table t2 on t1.id=t2.id
 
Вариант, конечно же, рабочий (я так думаю, проверить не могу). Но увы, как я писал с самого начала, вложенные запросы не работают.

Использую ADODB для получения данных из dbf. Если использовать строку Microsoft dBASE Driver (*.dbf), там вложенные запросы работают, но тогда вылетает ошибка "Внешняя таблица не имеет предполагаемый формат"
В VBA выглядит примерно так:
Код
Dim oConn As New ADODB.Connection
Dim oRs As New ADODB.Recordset
Dim sDSN As String, sSQL As String
'sDSN = "Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=" & DirPath & ";"
sDSN = "Driver=Microsoft FoxPro VFP Driver (*.dbf);SourceDB=" & DirPath & _
    ";SourceType=DBF;Null=Yes;Deleted=Yes;BackgroundFetch=Yes;Exclusive=Yes"
oConn.Open sDSN 
sSQL = "SELECT ....."
oRs.Open sSQL, oConn, adOpenStatic, adLockBatchOptimistic

Может, кто подскажет что-то правильное в части подключения?

 
а если так?
Код
    Dim ObjRs As Object, Sql$, Conn$
    Conn = "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=dBASE IV;Data Source=" & DirPath
    Sql = "select t2.*, t1.countID from (select count(*) as countID,id from table group by id) t1 inner join table t2 on t1.id=t2.id"
    Set ObjRs = CreateObject("ADODB.Recordset")
    With ObjRs
        .Open Sql, Conn, 3, 4
        If Not .EOF Then Sheets.Add.[A1].CopyFromRecordset ObjRs Else MsgBox "что-то пошло не так..."
        .Close
    End With
    Set ObjRs = Nothing
Изменено: Андрей Лящук - 16.12.2019 09:41:37
 
Увы, не помогло. Проблема в формате исходных данных, т.к. опять "Внешняя таблица не имеет предполагаемый формат".

В общем, проблему решил дополнительной обработкой Recordset:
- Получение всего списка (code - уникальные)
- Получение списка с перечнем code, у которых count(id)>1, т.е. количества разных code с одинаковым id.
- Добавление в основной список данных по количеству одинаковых id по каждому code.

Спасибо за желание помочь.
Страницы: 1
Наверх