Как получить несколько промежуточных итогов с использованием SQL и VBS из таблицы доступа? - PullRequest
2 голосов
/ 26 марта 2019

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

mySQL = "SELECT [Data.Time],"& Quantity &"*Sum([Data.Price]) AS 
SumOfPrice FROM Data WHERE (  ( [Data.Ticker] Like '"& CE1 &"'  
Or [Data.Ticker] Like '"& CE2 &"' Or [Data.Ticker] Like '"& CE3 &"' 
Or [Data.Ticker] Like '"& CE4 &"' Or [Data.Ticker] Like '"& CE5 &"' 
Or [Data.Ticker] Like '"& PE1 &"' Or [Data.Ticker] Like '"& PE2 &"' 
Or [Data.Ticker] Like '"& PE3 &"' Or [Data.Ticker] Like '"& PE4 &"' 
Or [Data.Ticker] Like '"& PE5 &"' 
 ) AND ([Data.DateTr]=#"& DateIn &"#))
 GROUP BY [Data.Time] HAVING [Data.Time] > #"& startTime(i) &"# and (((Count([Data.Ticker]))= 10))"

Дальнейшая обработка ....

objRecordSet2.Open mySQL,objConnection, adOpenStatic, adLockOptimistic
objRecordSet2.MoveFirst     
Do Until objRecordSet2.EOF
    If objRecordSet2.Fields.Item(1) > testvalue

В настоящее время он предоставляет общее количество CE + PE за каждый раз (каждую 1 минуту) Необходимо обеспечить ровно 5 записей CE и 5 записей PE на каждый момент времени, следовательно, всего 10.

Можем ли мы изменить его для раздельного получения общего количества CE и PE. ВЫБЕРИТЕ Время, SumofCEPrice, SumofPEPrice для каждой 1 минуты

Ответы [ 2 ]

0 голосов
/ 26 марта 2019

Просто добавьте Тикер в качестве другой переменной группировки в GROUP BY. Дополнительно рассмотрим следующие пункты:

  • Любое выражение LIKE без подстановочного оператора, % или *, является избыточным и должно использовать равенство =. Фактически, здесь вы можете использовать даже предложение IN();

  • Неагрегированные столбцы должны быть исключены из HAVING и помещены в предложение WHERE;

  • Использовать параметризацию, которая поддерживается соединениями DAO и ADO.

Скорректированная строка SQL

"SELECT [Data.Time], [Data.Ticker], "& Quantity &" * Sum([Data.Price]) AS SumOfPrice " & _
" FROM Data " & _
" WHERE ( " & _
"           ( [Data.Ticker] = '"& CE1 &"'  " & _
"            OR [Data.Ticker] = '"& CE2 &"' OR [Data.Ticker] = '"& CE3 &"' " & _
"            OR [Data.Ticker] = '"& CE4 &"' OR [Data.Ticker] = '"& CE5 &"' " & _
"            OR [Data.Ticker] = '"& PE1 &"' OR [Data.Ticker] = '"& PE2 &"' " & _
"            OR [Data.Ticker] = '"& PE3 &"' OR [Data.Ticker] = '"& PE4 &"' " & _
"            OR [Data.Ticker] = '"& PE5 &"' " & _
"           ) " & _
"           AND ([Data.DateTr] = #" & DateIn & "#)" & _
"           AND ([Data.Time] > #" & startTime(i) & "#) " & _
"       ) " & _
" GROUP BY [Data.Time], [Data.Ticker] " & _
" HAVING Count(([Data.Ticker]) = 10)"

В качестве альтернативы используйте параметризацию с ADO Command :

' PREPARED STATEMENT (NO DATA)
mySQL = "SELECT [Data.Time], [Data.Ticker], ? * Sum([Data.Price]) AS SumOfPrice " & _
        " FROM Data " & _
        " WHERE ([Data.Ticker] IN (?, ?, ?, ?, ?,  " & _
        "                          ?, ?, ?, ?, ?)) " & _
        "   AND ([Data.DateTr] = ?) " & _
        "   AND ([Data.Time] > ?) " & _
        " GROUP BY [Data.Time], [Data.Ticker] " & _
        " HAVING Count(([Data.Ticker]) = 10)"

Set objCmd = New ADODB.Command

With objCmd
   .ActiveConnection = objConnection
   .CommandText = mySQL
   .CommandType = adCmdText

   ' BIND PARAMETERS CORRESPONDING TO ORDER OF ? PLACEMARKERS
   .Parameters.Append .CreateParameter("pmQty", adInteger, adParamInput, , Quantity)

   For Each var In Array(CE1, CE2, CE3, CE4, CE5, PE1, PE2, PE3, PE4, PE5)
       .Parameters.Append .CreateParameter(, adVarChar, adParamInput, 50, var)
   Next var

   .Parameters.Append .CreateParameter("pmDateIn", adDate, adParamInput, , DateIn)
   .Parameters.Append .CreateParameter("pmStartTime", adDBTime, adParamInput, , startTime(i))

   ' BUILD RECORDSET FROM EXECUTION
   Set objRecordSet2 = .Execute
End With

objRecordSet2.MoveFirst     
Do Until objRecordSet2.EOF
    If objRecordSet2.Fields.Item(1) > testvalue
0 голосов
/ 26 марта 2019

Вы можете использовать условное агрегирование, изменив свой оператор select на:

"SELECT [Data.Time]," & Quantity & "*Sum(iif([Data.Ticker] Like '" & CE1 & "' or [Data.Ticker] Like '" & CE2 & "' or [Data.Ticker] Like '" & CE3 & "' or [Data.Ticker] Like '" & CE4 & "' or [Data.Ticker] Like '" & CE5 & "',[Data.Price],0)) AS SumofCEPrice "

Со столбцом SumofPEPrice, построенным аналогичным образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...