峰峦@叠嶂 2023-12-19 18:49 采纳率: 98.4%
浏览 4
已结题

针对数据表查询结果,只计算前几行的原因

请教个问题,我想针对查询出的结果,求个标准差(GMP出成 - 实际出成),但奇怪的是,目前查询结果只计算前几行的标准差值,而后面查询结果就不计算了,我的代码及截图如下,请大家帮我分析一下原因,怎么解决吧,谢谢;

img

 sqlstring = @"SELECT t6.date as date,t6.batchNo as batchNo,t6.proName as proName,t6.spec as spec ,t10.unit as unit,t6.standardbox as standardbox,t6.ActRate as ActRate,t6.GmpRate as GmpRate ,t11.rewardprice as rewardprice
           FROM  w_proratexksYX t6 inner join w_productpriceUP t10 on t6.proName = t10.proName  inner join w_proyirate t11 on t6.proName = t11.proName and t6.spec = t11.spec

            UNION 

         SELECT  t5.date as date,t5.batchNo as batchNo,t5.proName as proName,t5.spec as spec,t10.unit as unit,t5.standardbox as standardbox,t5.ActRate as ActRate,t5.GmpRate as GmpRate ,t11.rewardprice as rewardprice
           FROM  w_drugparticle t5 inner join w_productpriceUP t10 on t5.proName = t10.proName  inner join w_proyirate t11 on t5.proName = t11.proName and t5.spec = t11.spec                

          WHERE date BETWEEN '2023-12-01' AND '2023-12-30'";

 SqlCommand cmd = new SqlCommand(sqlstring, conn);

 SqlDataAdapter sda = new SqlDataAdapter(cmd);

 dt.Rows.Clear();
 dt.Columns.Clear();

 sda.Fill(dt);

 dt.Columns.Add("标准差", typeof(decimal));
 dt.Columns.Add("金额", typeof(decimal));
 dt.Columns.Add("奖惩金额", typeof(decimal));

 dataGridView1.DataSource = dt;

 foreach (DataRow row in dt.Rows)
 {
     //以下,标准差 = GMP出成 - 实际出成;
     decimal a;

     decimal actrate = Convert.ToDecimal(row["ActRate"]);

     decimal gmprate = Convert.ToDecimal(row["GmpRate"]);

     a = gmprate - actrate;

     row["标准差"] = a.ToString();
。。。。。
}


  • 写回答

1条回答 默认 最新

  • 梦回阑珊 2023-12-19 18:54
    关注

    【以下回答由 chatGPT 生成】

    回复不易,麻烦关注下博主,后面还有问题直接私信我,谢谢!!!

    从你提供的代码片段和问题描述来看,可能出现问题的地方有以下几点:

    数据类型转换问题:

    在计算标准差时,你使用了 Convert.ToDecimal() 来将数据库查询结果的列转换为 decimal 类型。有时候,如果数据类型不匹配或者转换出现问题,可能会导致部分行的计算出错。
    行数据缺失或异常:

    在数据处理过程中,可能存在某些行缺少数据或者数据异常,导致部分行无法正确计算标准差,从而出现了只有前几行有计算结果的情况。
    针对这些可能的问题,你可以通过以下方式来进行调试和解决:

    检查数据异常:

    首先,检查查询结果中的数据是否存在异常或缺失。可以在计算标准差之前,先输出查询结果,检查所有相关列的数据是否存在问题,比如是否有空值或者其他异常值。
    调整数据类型转换方式:

    可以尝试更健壮的方式来进行数据类型转换,例如使用 decimal.TryParse() 方法,它可以在无法转换时不抛出异常,并允许你更好地处理转换失败的情况。
    示例:

    decimal actrate, gmprate;
    if (decimal.TryParse(row["ActRate"].ToString(), out actrate) &&
        decimal.TryParse(row["GmpRate"].ToString(), out gmprate))
    {
        decimal difference = gmprate - actrate;
        row["标准差"] = difference;
    }
    
    
    

    排查可能的异常情况:
    如果数据异常或数据行缺失问题得到确认,需要检查原始数据,确保所有计算所需的数据都是完整和正确的。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 12月28日
  • 已采纳回答 12月20日
  • 创建了问题 12月19日