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. php用soap创建webservice

    php提供了一个专门用于soap操作的扩展库,使用该扩展库后 可以直接在php中进行soap操作.下面将介绍soap的基本操作. 一.soap扩展的使用方法 php的soap扩展库通过soap协议实现 ...

  2. javascript return false 详解

    在大多数情况下,为事件处理函数返回false,可以防止默认的事件行为.例如,默认情况下点击一个<a>元素,页面会跳转到该元素href属性指定的页. Return False 就相当于终止符 ...

  3. 【SpringMVC】SpringMVC系列8之Servlet API 作为入参

    8.Servlet API 作为入参 8.1.概述 MVC 的 Handler 方法可以接受哪些 ServletAPI 类型的参数: HttpServletRequest HttpServletRes ...

  4. css 中的度量单位

    px 相对长度单位.像素(Pixel). 像素是相对于显示器屏幕分辨率而言的.譬如,WONDOWS的用户所使用的分辨率一般是96像素/英寸.而MAC的用户所使用的分辨率一般是72像素/英寸. em 相 ...

  5. swfit 中的类型属性说明

    swift 中不叫做类属性,叫类型属性,因为在swift中,struct 和enum也是可以有这种属性的,叫类属性明显不准. 有以下注意事项: 对于值类型(指结构体和枚举)可以定义存储型和计算型类型属 ...

  6. Java for LeetCode 046 Permutations

    Given a collection of numbers, return all possible permutations. For example, [1,2,3] have the follo ...

  7. List对象分组排序算法

    场景: List里面的对象是订单的节点,比如我们快递的物流状态,这个是需要有序的,所以需要根据订单号进行分组排序. import java.util.ArrayList; import java.ut ...

  8. java单例,懒汉&饿汉

     * 单例模式Singleton  * 应用场合:有些对象只需要一个就足够了,如皇帝  * 作用: 保证整个应用程序中某个实例有且只有一个  * 区别: 饿汉模式的特点是加载类时比较慢,但运行是比较快 ...

  9. MVC中session创建并获取问题

    有两个ActionResult分别为A和B,如下 public ActionResult A() { Session["test"]="123"; return ...

  10. Reactor模式详解

    转自:http://www.blogjava.net/DLevin/archive/2015/09/02/427045.html 前记 第一次听到Reactor模式是三年前的某个晚上,一个室友突然跑过 ...