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

System.Data.DataTable计算功能详解

发布时间:2020-12-12 15:56:07 所属栏目:MsSql教程 来源:网络整理
导读:? 转帖: using ?System; using ?System.ComponentModel; using ?System.Data; using ?System.Windows.Forms; namespace ?WindowsApplication1 { ???? public ? partial ? class ?Form1?:?Form ????{ ???????? ???????? public ?Form1() ????????{ ?????????

?

转帖:

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语句并且减轻服务器计算符合^&^
???????????????????????????????????????????}????????????}} ?

(编辑:李大同)

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

    推荐文章
      热点阅读