请原谅我这个问题的缓慢使用。
我正在尝试计算每位候选人的总票数和这些票数的百分比。
我的逻辑似乎没有起作用,因为我遇到了一个错误:
pct未声明
有任何想法如何解决这个问题?
For Each row As DataRow In ds.Tables("choices").Rows
Dim cmdAns As New SqlCommand("select count(*), 100.0 * ((SUM(candidateId)) / (SUM(SUM(candidateId))OVER())) AS pct from ElectionResults where candidateid=@cid", cnn)
Dim pCid As New SqlParameter("@cid", row("candidateid"))
cmdAns.Parameters.Add(pCid)
Dim count As Integer = cmdAns.ExecuteScalar()
row("CandidateName") = row("CandidateName") & " - " & count & "(" & pct & ") %"
Next
答案 0 :(得分:1)
您走在正确的轨道上,但取id
的总和通常不是正确的方法。
select count(*),
(100.0 * (cast(count(*) as float) / SUM(count(*)) over ()) AS pct
from ElectionResults
where candidateid = @cid;
因为SQL Server进行整数除法,所以要特别注意在括号的计算中不会发生这种情况。
答案 1 :(得分:0)
ExecuteScalar()
只返回一个值:
执行查询,并返回第一行的第一列 查询返回的结果集。其他列或行是 忽略。
如果您选择多个字段,则需要使用ExecuteReader()
这样的事情应该有效:
For Each row As DataRow In ds.Tables("choices").Rows
Dim cmdAns As New SqlCommand("select count(*),...candidateid=@cid", cnn)
Dim pCid As New SqlParameter("@cid", row("candidateid"))
cmdAns.Parameters.Add(pCid)
Dim data As SqlDataReader
data = command.ExecuteReader()
While data.Read
If data.HasRows = True Then
Dim count As String = data(0)
Dim pct As String = data(1)
row("CandidateName") = row("CandidateName") & " - " & count & "(" & pct & ") %"
End If
End While
Next