• C#实现SQL SERVER2008聚合函数


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

    单击项目右键,在弹出菜单中选择"添加"->"聚合",取名为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示例数据库

  • 相关阅读:
    自定义长时间定时器对象
    poj1326
    poj1323
    poj1218
    poj1298
    poj1276
    新年的第一场雪
    Java 语言学习总结
    假使时光能够倒转
    为了回家——春运3日战纪实
  • 原文地址:https://www.cnblogs.com/djcsch2001/p/2806123.html
Copyright © 2020-2023  润新知