datatable computer 的使用(转载)

(原文)http://www.cnblogs.com/chinafine/archive/2008/08/23/1274700.html
这个是我的问题解决的源代码
  1. Imports System.Linq
  2. Imports System.Data
  3. Public Class Form1
  4.     Private Sub Form1_Load(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles MyBase.Load
  5.         Dim sql = New SqlHelper.DataBaseHelper
  6.         Dim ds = sql.ExecQuery("SELECT P_DPRES_TYPE AS 处方类型, P_DPRES_ITEM_CODE AS 项目代码," & _
  7.                                " P_DPRES_ITEM_NAME AS 项目名称, P_DPRES_SPEC AS 规格," & _
  8.                                " P_DPRES_DOSAGE AS 计量, P_DPRES_UNIT AS 单位, P_DPRES_USAGE AS 用法 " & _
  9.                                " FROM ORD_PACKAGE_PRES_DTL ")
  10.         Dim colum As New DataColumn
  11.         colum.ColumnName = "处方类型2"
  12.         colum.Caption = colum.ColumnName
  13.         colum.Expression = "iif(处方类型=1,'西成药',(iif(处方类型=2,'中草药',iif(处方类型=3,'项目',iif(处方类型=4,'材料','其他')))))"
  14.         ds.Tables(0).Columns.Add(colum)
  15.         OutlookGrid1.Dock = DockStyle.Fill
  16.         Me.OutlookGrid1.BindData(ds, ds.Tables(0).TableName)
  17.         Dim out = New OutlookStyleControls.OutlookgGridDefaultGroup
  18.         Me.OutlookGrid1.GroupTemplate = out
  19.         Me.OutlookGrid1.GroupTemplate.Column = OutlookGrid1.Columns("处方类型2")
  20.         Me.OutlookGrid1.Sort(New OutlookGridControl.OutlookGrid.DataRowComparer(Me.OutlookGrid1.GroupTemplate.Column.Index, 0))
  21.     End Sub
  22. End Class

以下是显示结果

https://p-blog.csdn.net/images/p_blog_csdn_net/maxjove/EntryImages/20081221/EUK%BJ(%R1DO2KJC_PG1XTN.jpg
 

以下是作者的源代码

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Data;
  6. namespace Console11
  7. {
  8.     class Program
  9.     {
  10.         static void Main(string[] args)
  11.         {
  12.             System.Data.DataTable table = new DataTable();
  13.             //计算常量,可以没有初始化列
  14.             object test = table.Compute("1+1""");
  15.             Console.WriteLine(test);
  16.             string a = "123";
  17.             System.Double b=123;
  18.             decimal c=123m;
  19.             Console.WriteLine((float)a);
  20.             //test=2;
  21.             test = table.Compute("1+1""false");
  22.             Console.WriteLine(test);
  23.             //test=2;常数计算和filter无关
  24.             test = table.Compute("abs(1)""");
  25.             Console.WriteLine(test);
  26.             //test=null,不知道为这个什么没有报错,而且返回null,其他的数学函数都会抱错
  27.             test = table.Compute("2%2""");
  28.             Console.WriteLine(test);
  29.             //test=0;
  30.             //其他函数参考下面的计算列
  31.             //初始化datatale
  32.             table.Columns.Add("id"typeof(string));
  33.             table.Columns.Add("value"typeof(int));
  34.             for (int i = 1; i <= 10; i++)
  35.             {
  36.                 System.Data.DataRow dRow = table.NewRow();
  37.                 dRow["id"] = "id" + i.ToString();
  38.                 dRow["value"] = i;
  39.                 table.Rows.Add(dRow);
  40.             }
  41.             //test = table.Compute("value+1", "true");
  42.             /**/
  43.             抛出异常,这里必须是聚合函数
  44.             //*************************************支持的聚合函数**********************//
  45.             //求数量
  46.             test = table.Compute("count(id)""false");
  47.             Console.WriteLine(test);
  48.             //test=0;
  49.             test = table.Compute("count(id)""true");
  50.             Console.WriteLine(test);
  51.             //test=10;
  52.             //求和
  53.             test = table.Compute("sum(value)""");
  54.             Console.WriteLine(test);
  55.             //test=55;
  56.             //test = table.Compute("sum(id)","");
  57.             /**/
  58.             抛出异常,这里不能是string
  59.             //平均
  60.             test = table.Compute("avg(value)""");
  61.             Console.WriteLine(test);
  62.             //test=5;
  63.             //最小
  64.             test = table.Compute("min(value)""");
  65.             Console.WriteLine(test);
  66.             //test=1;
  67.             //最大
  68.             test = table.Compute("max(value)""");
  69.             Console.WriteLine(test);
  70.             //test=10;
  71.             //统计标准偏差
  72.             test = table.Compute("StDev(value)""");
  73.             Console.WriteLine(test);
  74.             //test=3.02765035409749
  75.             //统计方差
  76.             test = table.Compute("Var(value)""");
  77.             Console.WriteLine(test);
  78.             //test=9.16666666666667
  79.             //复杂计算
  80.             test = table.Compute("max(value)/sum(value)""");
  81.             Console.WriteLine(test);
  82.             //test=0.181818181818182
  83.             /**/
  84.             /*******************************************计算列*************************/
  85.             System.Data.DataColumn column = new DataColumn("exp1"typeof(float));
  86.             table.Columns.Add(column);
  87.             //简单计算
  88.             column.Expression = "value*2";
  89.             test = table.Select("id='id1'")[0]["exp1"];
  90.             Console.WriteLine(test);
  91.             //test=2;
  92.             //字符串函数
  93.             column.Expression = "len(id)";
  94.             test = table.Select("id='id1'")[0]["exp1"];
  95.             Console.WriteLine(test);
  96.             //test=3;
  97.             //字符串函数
  98.             column.Expression = "len(' '+id+' ')";
  99.             test = table.Select("id='id1'")[0]["exp1"];
  100.             Console.WriteLine(test);
  101.             //test=5;
  102.             //字符串函数
  103.             column.Expression = "len(trim(' '+id+' '))";
  104.             test = table.Select("id='id1'")[0]["exp1"];
  105.             Console.WriteLine(test);
  106.             //test=3;
  107.             //字符串函数
  108.             column.Expression = "substring(id,3,len(id)-2)";
  109.             test = table.Select("id='id1'")[0]["exp1"];
  110.             Console.WriteLine(test);
  111.             //test=1; //substring的起始字符位置为1不是0
  112.             //类型转换
  113.             column.Expression = "convert(substring(id,3,len(id)-2),'System.Int32')*1.6";
  114.             test = table.Select("id='id1'")[0]["exp1"];
  115.             Console.WriteLine(test);
  116.             //test=1.6;
  117.             //相当于sqlserver的isnull
  118.             column.Expression = "isnull(value,10)";
  119.             test = table.Select("id='id1'")[0]["exp1"];
  120.             Console.WriteLine(test);
  121.             //test=1;
  122.             //三元运算符,相当于sqlserver的case when
  123.             column.Expression = "iif(value>5,1000,2000)";
  124.             test = table.Select("id='id1'")[0]["exp1"];
  125.             Console.WriteLine(test);
  126.             //test=2000;
  127.             //like运算符
  128.             column.Expression = "iif(id like '%1',1000,2000)";
  129.             test = table.Select("id='id1'")[0]["exp1"];
  130.             Console.WriteLine(test);
  131.             //test=1000;
  132.             //in运算符
  133.             column.Expression = "iif(id not in('id1'),1000,2000)";
  134.             test = table.Select("id='id1'")[0]["exp1"];
  135.             Console.WriteLine(test);
  136.             //test=2000;
  137.             //嵌套的三元运算
  138.             column.Expression = "iif(value>5,1000,iif(id like '%1',4000,2000))";
  139.             test = table.Select("id='id1'")[0]["exp1"];
  140.             Console.WriteLine(test);
  141.             //test=4000;
  142.             //客户端计算所占总数的百分比
  143.             column.Expression = "value/sum(value)";
  144.             test = table.Select("id='id1'")[0]["exp1"];
  145.             Console.WriteLine(test);
  146.             //test=0.01818182
  147.             //客户端计算差值,比如nba常规赛的胜场差
  148.             column.Expression = "max(value)-value";
  149.             test = table.Select("id='id1'")[0]["exp1"];
  150.             Console.WriteLine(test);
  151.             //test=9
  152.             //***********************父子表计算*************************************/
  153.             //初始化子表,父子表关系
  154.             DataTable tableChild = new DataTable();
  155.             tableChild.Columns.Add("id"typeof(string));
  156.             tableChild.Columns.Add("value"typeof(int));
  157.             System.Data.DataSet ds = new DataSet();
  158.             ds.Tables.Add(tableChild);
  159.             ds.Tables.Add(table);
  160.             DataRelation relation = new DataRelation("relation", table.Columns["id"], tableChild.Columns["id"]);
  161.             ds.Relations.Add(relation);
  162.             for (int i = 1; i <= 10; i++)
  163.             {
  164.                 System.Data.DataRow dRow = tableChild.NewRow();
  165.                 dRow["id"] = "id1";
  166.                 dRow["value"] = i;
  167.                 tableChild.Rows.Add(dRow);
  168.             }
  169.             //计算子表记录数
  170.             column.Expression = "count(child(relation).value)";
  171.             test = table.Select("id='id1'")[0]["exp1"];
  172.             Console.WriteLine(test);
  173.             //test=10;
  174.             //计算父子表的百分比
  175.             column.Expression = "value/sum(child(relation).value)";
  176.             test = table.Select("id='id1'")[0]["exp1"];
  177.             Console.WriteLine(test);
  178.             //test=0.01818182;
  179.             //计算父子表的差值,比如父表为库存数量,子表为订购数量,计算得出需要补充的数量
  180.             column.Expression = "iif(value-sum(child(relation).value)>0,0,value-sum(child(relation).value))";
  181.             test = table.Select("id='id1'")[0]["exp1"];
  182.             Console.WriteLine(test);
  183.             //test=-54;
  184.             //比较遗憾的是没有发现能够计算同比和环比的方法,而且计算列无法作为约束
  185.             //************结束,DataTable可以让你尽量发挥聪明才智来减少繁杂的sql语句并且减轻服务器计算符合
  186.         }
  187.     }
  188. }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值