如何使用 SQL 和 VBS 从 Access Table 获取多个小计?
How to obtain Multiple subtotals using SQL and VBS from Access Table?
我正在尝试使用 Windows 中的外部 vbs 文件 vbscript 从 Access Table 获取多个小计。
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
目前提供每次(每1分钟)的CE+PE总和
必须确保每个时刻正好有 5 条 CE 记录和 5 条 PE 记录,因此总共 10.
我们能否修改它以单独提供 CE 和 PE 的总数。
SELECT 每 1 分钟时间,SumofCEPrice,SumofPEPrice
您可以通过将 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
列。
只需添加 Ticker 作为 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
我正在尝试使用 Windows 中的外部 vbs 文件 vbscript 从 Access Table 获取多个小计。
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
目前提供每次(每1分钟)的CE+PE总和 必须确保每个时刻正好有 5 条 CE 记录和 5 条 PE 记录,因此总共 10.
我们能否修改它以单独提供 CE 和 PE 的总数。 SELECT 每 1 分钟时间,SumofCEPrice,SumofPEPrice
您可以通过将 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
列。
只需添加 Ticker 作为 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