c#平均不计算零
本文关键字:计算 | 更新日期: 2023-09-27 18:16:29
参考这个链接:SQL Server表
在运行"平均"记录时,如何跳过零值?例子:
ID Number01 TheDate Number02
----------------------------------------
1 10 01/06/2014 5
2 20 02/06/2014 0
3 30 03/06/2014 15
4 50 04/06/2014 60
5 0 05/06/2014 0
6 0 06/06/2014 0
7 0 07/06/2014 0
TOTAL 110 - 80
AVE 27.50 - 26.67
检查上表。
'Number01'字段,如果我对所有记录运行平均公式。平均值是15.71,但如果我跳过零值,平均值是27.50。同样适用于"Number02"字段。
这是我的代码后面:
int totnum1 = 0;
decimal totnum2 = 0;
int numRow = 0;
decimal avg1 = 0;
decimal avg2 = 0;
totnum1 += reader.GetInt32(1);
totnum2 += reader.GetInt32(3);
numRow ++;
avg1 = totnum1 / numRow;
avg2 = totnum2 / numRow;
public string getWhileLoopData() {
string htmlStr = "";
SqlConnection thisConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString);
SqlCommand thisCommand = thisConnection.CreateCommand();
thisCommand.CommandText = "SELECT * FROM MyTable WHERE TheDate = @TheDate";
thisCommand.Parameters.AddWithValue("@TheDate", txtDate.Text);
int totnum1 = 0;
decimal totnum2 = 0;
int numRow = 0;
decimal avg1 = 0;
decimal avg2 = 0;
thisConnection.Open();
SqlDataReader reader = thisCommand.ExecuteReader();
while (reader.Read()) {
int id = reader.GetInt32(0);
int Number01 = reader.GetInt32(1);
DateTime TheDate = reader.GetDateTime(2);
Decimal Number02 = reader.GetDecimal(3);
totnum1 += reader.GetInt32(1);
totnum2 += reader.GetInt32(3);
numRow ++;
//string Pass = reader.GetString(2);
htmlStr += "<tr><td>" + id + "</td><td>" + Number01 + "</td><td>" + TheDate + "</td><td>" + Number02 + "</td></tr>";
}
thisConnection.Close();
avg1 = totnum1 / numRow;
avg2 = totnum2 / numRow;
htmlStr += string.Format("<tfoot><tr><td>Tot</td><td>{0}</td><td></td><td>{1}</td></tr>", totnum1 , totnum2 );
htmlStr += string.Format("<tfoot><tr><td>Avg</td><td>{0}</td><td></td><td>{1}</td></tr></tfoot>", avg1 , avg2 );
return htmlStr;
}
在不知道数据结构的情况下很难给出确切的代码,但假设您正在寻找c#代码,LINQ将很好地完成此工作。否则,SQL中的WHERE
将。我会根据一些事情来选择它们,但主要是你是否需要把数据拉下来。例如,如果您要打印一个包含总计行的表格,我会使用LINQ解决方案。但是,如果你只是在寻找显示其本身的平均值,则使用WHERE
。
int[] args = new int[] { 0, 10, 25, 0, 70 };
return args.Where(c => c != 0).Average();
编辑:查看您所要求的链接,我只需添加List<int>
来存储所有值,然后针对该值运行此查询。这不是最有效的解决方案,但我不觉得效率比可读性更重要,如果记录很少,这种差异并不明显。
如果您想在构建平均值之前过滤掉零…好吧,在建立平均值之前,您必须过滤掉零:
SELECT AVG(Value)
FROM YourTable
WHERE Value <> 0
浏览你链接的文章。您需要做的是更改以下行:
totnum1 += reader.GetInt32(1);
totnum2 += reader.GetInt32(3);
numRow ++;
:
totnum1 += Number01;
totnum2 += Number02;
if(Number01 != 0 || Number02 != 0) numRow ++;
numRow
仅在当前行中对应的列不为零时才会增加,因此Avg表达式的dom仅计数非零行。