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#平均不计算零

在不知道数据结构的情况下很难给出确切的代码,但假设您正在寻找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仅计数非零行。