加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

System.Data.DataTable计算功能详解

发布时间:2020-12-12 15:25:20 所属栏目:MsSql教程 来源:网络整理
导读:System.Data.DataTable计算功能详解 收藏 ?using? System; ?using? System.ComponentModel; ?using? System.Data; ?using? System.Windows.Forms; ?namespace? WindowsApplication1 ? ... { ????? public?? partial?? class? Form1 : Form ?????? ... { ????

System.Data.DataTable计算功能详解 收藏
?using? System;
?using? System.ComponentModel;
?using? System.Data;
?using? System.Windows.Forms;
?namespace? WindowsApplication1
? ... {
????? public?? partial?? class? Form1 : Form
?????? ... {
????????
????????? public? Form1()
?????????? ... {
???????????? InitializeComponent();
???????? }
?
???????
?
????????? private?? void? button1_Click( object? sender,EventArgs e)
?????????? ... {
?
????????????? // System.Data.DataTable计算功能详解,转载请保留以下信息
????????????? // 测试环境????? vs2005,c#
????????????? // 作者:???????? jinjazz
????????????? // 作者blog:????? http://blog.csdn.net/jinjazz/ ??????????? ????????????? System.Data.DataTable table? =?? new? DataTable();??????????????? // 计算常量,可以没有初始化列 ????????????? object? test? =? table.Compute( " 1+1 ",? "" );???????????? Console.WriteLine(test);????????????? // 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,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',2000) " ;???????????? test? =? table.Select( " id='id1' " )[ 0 ][ " exp1 " ];???????????? Console.WriteLine(test);????????????? // test=1000;?????????????? // in运算符 ???????????? column.Expression? =?? " iif(id not in('id1'),2000) " ;???????????? test? =? table.Select( " id='id1' " )[ 0 ][ " exp1 " ];???????????? Console.WriteLine(test);????????????? // test=2000;?????????????? // 嵌套的三元运算 ???????????? column.Expression? =?? " iif(value>5,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,value-sum(child(relation).value)) " ;???????????? test? =? table.Select( " id='id1' " )[ 0 ][ " exp1 " ];???????????? Console.WriteLine(test);????????????? // test=-54;?????????????? // 比较遗憾的是没有发现能够计算同比和环比的方法,而且计算列无法作为约束????????????? // ************结束,DataTable可以让你尽量发挥聪明才智来减少繁杂的sql语句并且减轻服务器计算符合^&^????????????????????????????????? }????? } ?}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读