首页 新闻 会员 周边

DataTable加工后添加行列,输出求和,百分比的问题请教!

0
悬赏园豆:15 [已解决问题] 解决于 2014-01-16 14:12

              DataTable oldDataTable = new DataTable();                       
 
                oldDataTable.Columns.Add("商品");
                oldDataTable.Columns.Add("销售成本");
                oldDataTable.Columns.Add("销售利润");
                 
                DataRow dr = oldDataTable.NewRow();
                for (int i = 0; i < 6; i++)
                {
                    dr = oldDataTable.NewRow();
                    dr["商品"] = "A";
                    dr["销售成本"] = 100+i;
                    dr["销售利润"] = 1000+i;                   
                    oldDataTable.Rows.Add(dr);
                }        

 

主要是插入了百分比的列,以及在末尾增加合计行。

注意不能有重复列名的问题。

alone2013的主页 alone2013 | 初学一级 | 园豆:46
提问于:2014-01-15 15:19
< >
分享
最佳答案
0
var oldDataTable = new DataTable();

            oldDataTable.Columns.Add("商品");
            oldDataTable.Columns.Add("销售成本");
            oldDataTable.Columns.Add("销售利润");

            DataRow dr = oldDataTable.NewRow();
            for (int i = 0; i < 6; i++)
            {
                dr = oldDataTable.NewRow();
                dr["商品"] = "A";
                dr["销售成本"] = 100 + i;
                dr["销售利润"] = 1000 + i;
                oldDataTable.Rows.Add(dr);
            }
            //步骤1、计算总成本,和总利润
            var totalCost = oldDataTable.Rows.Cast<DataRow>().Sum(x => Convert.ToInt32(x["销售成本"] ?? "0"));
            var totalProfit = oldDataTable.Rows.Cast<DataRow>().Sum(x => Convert.ToInt32(x["销售利润"] ?? "0"));
            //添加列
            oldDataTable.Columns.Add(new DataColumn("成本百分比", typeof(string)));
            oldDataTable.Columns.Add(new DataColumn("利润百分比", typeof(string)));
            //写入数据行数据
            foreach (DataRow dr1 in oldDataTable.Rows)
            {
                dr1["成本百分比"] = (Convert.ToInt32(dr1["销售成本"] ?? "0") / totalCost).ToString("P2");
                dr1["利润百分比"] = (Convert.ToInt32(dr1["销售利润"] ?? "0") / totalProfit).ToString("P2");
            }
            //追加最后一行的数据
            oldDataTable.Rows.Add("合计", totalCost, "100%", totalProfit, "100%");

你有必要多看看DataTable的操作!

收获园豆:11
幻天芒 | 高人七级 |园豆:37175 | 2014-01-15 17:37

列的顺序要如上图右边那个哦,要创建一个新的DataTable?

The convert type change to "Decimal".

 var oldDataTable = new System.Data.DataTable();
                var newDataTable = new System.Data.DataTable();


                oldDataTable.Columns.Add("商品");
                oldDataTable.Columns.Add("销售成本");
                oldDataTable.Columns.Add("销售利润");

                DataRow dr = oldDataTable.NewRow();
                for (int i = 0; i < 6; i++)
                {
                    dr = oldDataTable.NewRow();
                    dr["商品"] = "A"+i;
                    dr["销售成本"] = 100 + i;
                    dr["销售利润"] = 1000 + i;
                    oldDataTable.Rows.Add(dr);
                }
                //步骤1、计算总成本,和总利润
                var totalCost = oldDataTable.Rows.Cast<DataRow>().Sum(x => Convert.ToDecimal(x["销售成本"] ?? "0"));
                var totalProfit = oldDataTable.Rows.Cast<DataRow>().Sum(x => Convert.ToDecimal(x["销售利润"] ?? "0"));


                oldDataTable.Columns.Add(new DataColumn("成本百分比", typeof(string)));
                oldDataTable.Columns.Add(new DataColumn("利润百分比", typeof(string)));


                //添加列
                newDataTable.Columns.Add("商品");
                newDataTable.Columns.Add("销售成本");
                newDataTable.Columns.Add(new DataColumn("成本百分比", typeof(string)));
                newDataTable.Columns.Add("销售利润");
                newDataTable.Columns.Add(new DataColumn("利润百分比", typeof(string)));
                
                //写入数据行数据
                foreach (DataRow dr1 in oldDataTable.Rows)
                {
                    dr1["成本百分比"] = (Convert.ToDecimal(dr1["销售成本"] ?? "0") / totalCost).ToString("P2");
                    dr1["利润百分比"] = (Convert.ToDecimal(dr1["销售利润"] ?? "0") / totalProfit).ToString("P2");
                    
                    dr = newDataTable.NewRow();
                    dr["商品"] = dr1["商品"];
                    dr["销售成本"] = dr1["销售成本"];
                    dr["成本百分比"] = dr1["成本百分比"];
                    dr["销售利润"] = dr1["销售利润"];
                    dr["利润百分比"] = dr1["利润百分比"];
                    newDataTable.Rows.Add(dr);
                }
                //追加最后一行的数据
                newDataTable.Rows.Add("合计", totalCost, "100%", totalProfit, "100%");


ok了,newDataTable就是我想要的。

不过这样的性能是不是很槽糕呢?

 

alone2013 | 园豆:46 (初学一级) | 2014-01-15 23:42

@alone2013: 我想说为什么不在数据库做这事呢?sql语句就能搞定的!不需要在客户端来做!

幻天芒 | 园豆:37175 (高人七级) | 2014-01-16 11:40

@幻天芒: 

主要是因为原table或将绑定在GridView或序列化为json,在sql那处理的话,有些列,行是多余的了。

哪个性能更好呢?

用sql语句也是要通过Declare 变量,

然后用批处理完成?

如果写成存储过程是不是要比在c#里计算 的性能好呢?

alone2013 | 园豆:46 (初学一级) | 2014-01-16 12:49

@alone2013: 

public class Model
{
    public string 商品{get;set;}
    
    public string 成本{get;set;}
    
    [Newtonsoft.Json.JsonIgnore]//加上特性之后,json序列化,就忽略该字段了
    public string 成本占比{get;set;}
}

sql语句处理更简洁。性能更好。

幻天芒 | 园豆:37175 (高人七级) | 2014-01-16 13:19
其他回答(1)
0

关键是你什么不懂?

1、如果是EXCEL的话,合计和百分比,不需要由数据库提供,可以在EXCEL里面用公式完成。

2、如果是要构造在DATATABLE里面的话,ColumnName不一样这是必须的,你可以叫“百分比1”,“百分比2”

3、如果代码不懂,不至于吧?反正不费事,简单说下。

  a. 添加两列用于保存百分比

  b. 求出6行的合计,放在第7行里面,并放在一个合计变量里面,假设为TotalAmount。

  c. 循环1~6行,计算出百分比, Amount/TotalAmount。填入百分比列。

  d. 工作完成。

收获园豆:4
爱编程的大叔 | 园豆:30839 (高人七级) | 2014-01-15 16:55
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册