复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182using 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 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,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内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复