using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace Console11
{
    class Program
    {
        static void Main(string[] args)
        {
            System.Data.DataTable table = new DataTable();

//计算常量,可以没有初始化列
            object test = table.Compute("1+1", "");
            Console.WriteLine(test);

string a = "123";
            System.Double b=123;
            decimal c=123m;
            Console.WriteLine((float)a);
            //test=2;

test = table.Compute("1+1", "false");
            Console.WriteLine(test);
            //test=2;常数计算和filter无关

test = table.Compute("abs(1)", "");
            Console.WriteLine(test);
            //test=null,不知道为这个什么没有报错,而且返回null,其他的数学函数都会抱错

test = table.Compute("2%2", "");
            Console.WriteLine(test);
            //test=0;
            //其他函数参考下面的计算列

//初始化datatale
            table.Columns.Add("id", typeof(string));
            table.Columns.Add("value", typeof(int));
            for (int i = 1; i <= 10; i++)
            {
                System.Data.DataRow dRow = table.NewRow();
                dRow["id"] = "id" + i.ToString();
                dRow["value"] = i;
                table.Rows.Add(dRow);
            }

//test = table.Compute("value+1", "true");
            /**/
            ////抛出异常,这里必须是聚合函数

//*************************************支持的聚合函数**********************//

//求数量
            test = table.Compute("count(id)", "false");
            Console.WriteLine(test);
            //test=0;

test = table.Compute("count(id)", "true");
            Console.WriteLine(test);
            //test=10;

//求和
            test = table.Compute("sum(value)", "");
            Console.WriteLine(test);
            //test=55;

//test = table.Compute("sum(id)","");
            /**/
            ////抛出异常,这里不能是string

//平均
            test = table.Compute("avg(value)", "");
            Console.WriteLine(test);
            //test=5;

//最小
            test = table.Compute("min(value)", "");
            Console.WriteLine(test);
            //test=1;

//最大
            test = table.Compute("max(value)", "");
            Console.WriteLine(test);
            //test=10;

//统计标准偏差
            test = table.Compute("StDev(value)", "");
            Console.WriteLine(test);
            //test=3.02765035409749

//统计方差
            test = table.Compute("Var(value)", "");
            Console.WriteLine(test);
            //test=9.16666666666667

//复杂计算
            test = table.Compute("max(value)/sum(value)", "");
            Console.WriteLine(test);
            //test=0.181818181818182

/**/
            /*******************************************计算列*************************/

System.Data.DataColumn column = new DataColumn("exp1", typeof(float));
            table.Columns.Add(column);

//简单计算
            column.Expression = "value*2";
            test = table.Select("id='id1'")[0]["exp1"];
            Console.WriteLine(test);
            //test=2;

//字符串函数
            column.Expression = "len(id)";
            test = table.Select("id='id1'")[0]["exp1"];
            Console.WriteLine(test);
            //test=3;

//字符串函数
            column.Expression = "len(' '+id+' ')";
            test = table.Select("id='id1'")[0]["exp1"];
            Console.WriteLine(test);
            //test=5;

//字符串函数
            column.Expression = "len(trim(' '+id+' '))";
            test = table.Select("id='id1'")[0]["exp1"];
            Console.WriteLine(test);
            //test=3;

//字符串函数
            column.Expression = "substring(id,3,len(id)-2)";
            test = table.Select("id='id1'")[0]["exp1"];
            Console.WriteLine(test);
            //test=1; //substring的起始字符位置为1不是0

//类型转换
            column.Expression = "convert(substring(id,3,len(id)-2),'System.Int32')*1.6";
            test = table.Select("id='id1'")[0]["exp1"];
            Console.WriteLine(test);
            //test=1.6;

//相当于sqlserver的isnull
            column.Expression = "isnull(value,10)";
            test = table.Select("id='id1'")[0]["exp1"];
            Console.WriteLine(test);
            //test=1;

//三元运算符,相当于sqlserver的case when
            column.Expression = "iif(value>5,1000,2000)";
            test = table.Select("id='id1'")[0]["exp1"];
            Console.WriteLine(test);
            //test=2000;

//like运算符
            column.Expression = "iif(id like '%1',1000,2000)";
            test = table.Select("id='id1'")[0]["exp1"];
            Console.WriteLine(test);
            //test=1000;

//in运算符
            column.Expression = "iif(id not in('id1'),1000,2000)";
            test = table.Select("id='id1'")[0]["exp1"];
            Console.WriteLine(test);
            //test=2000;

//嵌套的三元运算
            column.Expression = "iif(value>5,1000,iif(id like '%1',4000,2000))";
            test = table.Select("id='id1'")[0]["exp1"];
            Console.WriteLine(test);
            //test=4000;

//客户端计算所占总数的百分比
            column.Expression = "value/sum(value)";
            test = table.Select("id='id1'")[0]["exp1"];
            Console.WriteLine(test);
            //test=0.01818182

//客户端计算差值,比如nba常规赛的胜场差
            column.Expression = "max(value)-value";
            test = table.Select("id='id1'")[0]["exp1"];
            Console.WriteLine(test);
            //test=9

//***********************父子表计算*************************************/

//初始化子表,父子表关系
            DataTable tableChild = new DataTable();

tableChild.Columns.Add("id", typeof(string));
            tableChild.Columns.Add("value", typeof(int));

System.Data.DataSet ds = new DataSet();
            ds.Tables.Add(tableChild);
            ds.Tables.Add(table);
            DataRelation relation = new DataRelation("relation", table.Columns["id"], tableChild.Columns["id"]);
            ds.Relations.Add(relation);

for (int i = 1; i <= 10; i++)
            {
                System.Data.DataRow dRow = tableChild.NewRow();
                dRow["id"] = "id1";
                dRow["value"] = i;
                tableChild.Rows.Add(dRow);
            }

//计算子表记录数
            column.Expression = "count(child(relation).value)";
            test = table.Select("id='id1'")[0]["exp1"];
            Console.WriteLine(test);
            //test=10;

//计算父子表的百分比
            column.Expression = "value/sum(child(relation).value)";
            test = table.Select("id='id1'")[0]["exp1"];
            Console.WriteLine(test);
            //test=0.01818182;

//计算父子表的差值,比如父表为库存数量,子表为订购数量,计算得出需要补充的数量
            column.Expression = "iif(value-sum(child(relation).value)>0,0,value-sum(child(relation).value))";
            test = table.Select("id='id1'")[0]["exp1"];
            Console.WriteLine(test);
            //test=-54;

//比较遗憾的是没有发现能够计算同比和环比的方法,而且计算列无法作为约束
            //************结束,DataTable可以让你尽量发挥聪明才智来减少繁杂的sql语句并且减轻服务器计算符合^&^

}
    }
}

DataTable求平均值,最大值,最小值

DataTable dsValue;
if (dsValue.Rows.Count > 0)
            {
                maxValue = float.Parse(dsValue.Compute("max([" + ParaName + "])", "" ).ToString());
                minValue = float.Parse(dsValue.Compute("min([" + ParaName + "])", "" ).ToString());
                avgValue = float.Parse(dsValue.Compute("avg([" + ParaName + "])", "" ).ToString());
                SDAVG = float.Parse(dsValue.Compute("avg([" + SDVALUE + "])", "" ).ToString());//设定平均
               
                if (avgValue.ToString() != string.Empty && SDAVG.ToString() != string.Empty)
                {
                    sszavg_sdzavg_subValue = Math.Abs(SDAVG - avgValue);
                }
                try
                {
                    sdValue = float.Parse(dsValue.Compute("StDev([" + ParaName + "])", "" ).ToString());
                }
                catch (Exception ex)
                {
                    sdValue = 0;
                }
            }

DataTable.Compute方法使用实例的更多相关文章

  1. C# DataTable Compute方法的使用

    在开发中需要对DataTable的数据进行处理,比如累加,求最大最小及平均值等,以前都采用手工对DataTable进行循环并计算的方式,现在发现DataTable的Compute方法可以轻松实现这些功 ...

  2. DataTable.Compute()用法

    DataTable.Compute()用法 2010-04-07 11:28 一.DataTable.Compute()方法說明如下 作用:          计算用来传递筛选条件的当前行上的给定表达 ...

  3. 转:DataTable.Compute()用法

    转自:http://www.cnblogs.com/fanyf/archive/2012/05/11/2495919.html一.DataTable.Compute()方法說明如下 作用: 计算用来传 ...

  4. C# DataTable.Compute()用法

    DataTable.Compute()用法 2010-04-07 11:28 一.DataTable.Compute()方法說明如下 作用:          计算用来传递筛选条件的当前行上的给定表达 ...

  5. DataTable.Compute()

    一.DataTable.Compute()方法說明如下 作用:          计算用来传递筛选条件的当前行上的给定表达式. 格式為:          Object Compute (string ...

  6. C#中DataTable中的Compute方法使用收集

    原文: C#中DataTable中的Compute方法使用收集 Compute函数的参数就两个:Expression,和Filter. Expresstion是计算表达式,关于Expression的详 ...

  7. [datatable]借助DataTable的Compute方法

    借助DataTable的Compute方法,DataTable中数据不用事先排好序. 下面代码中的dt是跟前面的是一样的 DataTable dtName = dt.DefaultView.ToTab ...

  8. c# 基于DataTable的Compute方法的扩展

    DataTable.Compute(String, String) 方法 定义 命名空间:System.Data 程序集:System.Data.dll, netstandard.dll, Syste ...

  9. 转载 C#中DataTable中的Compute方法使用收集

    原文: C#中DataTable中的Compute方法使用收集 Compute函数的参数就两个:Expression,和Filter. Expresstion是计算表达式,关于Expression的详 ...

随机推荐

  1. [BZOJ1067][SCOI2007]降雨量

    [BZOJ1067][SCOI2007]降雨量 试题描述 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意 Y<Z<X,Z年的降雨量严格 ...

  2. 减小Delphi XE5编译出来的程序体积

    默认Delphi XE, XE2, XE3,XE4,XE5, XE6 ... 编译出来的程序体积很大. 一般用两个方法可以很大程度上减少程序体积. 一.在工程中用编译指令禁用RTTI 禁用的方法很简单 ...

  3. 【转】android中Uri.parse()用法

    1,调web浏览器 Uri myBlogUri = Uri.parse("http://xxxxx.com"); returnIt = new Intent(Intent.ACTI ...

  4. github pages 添加godaddy的dns解析

    转自: http://andrewsturges.com/blog/jekyll/tutorial/2014/11/06/github-and-godaddy.html I own a custom ...

  5. 【云计算】K8S DaemonSet 每个node上都运行一个pod

    Kubernetes容器集群中的日志系统集成实践 Kubernetes是原生的容器编排管理系统,对于负载均衡.服务发现.高可用.滚动升级.自动伸缩等容器云平台的功能要求有原生支持.今天我分享一下我们在 ...

  6. 34.数组中2个只出现一次的数字[Find two numbers which appear once]

    [题目] 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度是O(1). [分析] 这是一道很新颖的关于位运算的面试题. ...

  7. Android读写assets、raw、sdard和工程文件的方法

    Android开发离不开对文件的操作,前面的文章“Android简易数据存储之SharedPreferences”和“Android数据存储之SQLite的操作”,分别讲解了简单的数据的存储和数据库数 ...

  8. 转载一篇ios7的新API文章

    不看不知道,一看吓一跳啊!请看看吧,http://leafduo.com/articles/2013/09/28/ios7/

  9. java 和 objective-c 动态获得类型信息

    详细信息,请参看android官方文档中的class类的介绍 ,和苹果的官方文档Objective-C Runtime Reference java中常常听到反射reflection,在java的cl ...

  10. delphi提示“Undeclared_identifier”的缺少引用单元列表

    _Stream ADODB_TLB akTop, akLeft, akRight, akBottom Controls Application (the variable not a type) Fo ...