C#实现SQL SERVER2008聚合函数-阿里云开发者社区

开发者社区> 数据库> 正文

C#实现SQL SERVER2008聚合函数

简介: 下面实现一个去掉最大值和最小值之后的平均值函数: 单击项目右键,在弹出菜单中选择"添加"->"聚合",取名为TrimmedMean.cs,代码如下: 1 using System; 2 using System.

下面实现一个去掉最大值和最小值之后的平均值函数:

单击项目右键,在弹出菜单中选择"添加"->"聚合",取名为TrimmedMean.cs,代码如下:

 1 using System;
 2 using System.Data;
 3 using System.Data.SqlClient;
 4 using System.Data.SqlTypes;
 5 using Microsoft.SqlServer.Server;
 6 
 7 
 8 [Serializable]
 9 [Microsoft.SqlServer.Server.SqlUserDefinedAggregate(Format.Native)]
10 public struct TrimmedMean
11 {
12     //    SELECT   AVG(TotalDue) AS AvgTotal, 
13     //dbo.TrimmedMean(TotalDue) AS TrimmedTotal
14     //FROM      Sales.SalesOrderHeader
15     public void Init()
16     {
17         // 在此处放置代码
18         this.numValues = 0;
19         this.totalValue = 0;
20         this.maxValue = SqlMoney.MinValue;
21         this.minValue = SqlMoney.MaxValue;
22     }
23 
24     public void Accumulate(SqlMoney Value)
25     {
26         // 在此处放置代码
27         if (!Value.IsNull)
28         {
29             this.numValues++;
30             this.totalValue += Value;
31             if (Value < this.minValue)
32                 this.minValue = Value;
33             if (Value > this.maxValue)
34                 this.maxValue = Value;
35         }
36     }
37 
38     public void Merge(TrimmedMean Group)
39     {
40         // 在此处放置代码
41         if (Group.numValues > 0)
42         {
43             this.numValues += Group.numValues;
44             this.totalValue += Group.totalValue;
45             if (Group.minValue < this.minValue)
46                 this.minValue = Group.minValue;
47             if (Group.maxValue > this.maxValue)
48                 this.maxValue = Group.maxValue;
49         }
50     }
51 
52     public SqlMoney Terminate()
53     {
54         // 在此处放置代码
55         if (this.numValues < 3)
56             return (SqlMoney.Null);
57         else
58         {
59             this.numValues -= 2;
60             this.totalValue -= this.minValue;
61             this.totalValue -= this.maxValue;
62             return (this.totalValue / this.numValues);
63         }
64     }
65 
66     // 这是占位符成员字段
67     private int numValues;
68     private SqlMoney totalValue;
69     private SqlMoney minValue;
70     private SqlMoney maxValue;
71 }


单击项目右键,弹出菜单中先"生成",再"部署",在SQL SERVER 2008中测试如下:

SELECT

  AVG(TotalDue) As AverageTotal,

  dbo.TrimmedMean(TotalDue) AS TrimedAverageTotal

FROM Sales.SalesOrderHeader

 

使用的是AdventureWorks示例数据库

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
数据库
使用钉钉扫一扫加入圈子
+ 订阅

分享数据库前沿,解构实战干货,推动数据库技术变革

其他文章