Sql Server自定义聚合函数详细步骤
创新互联-专业网站定制、快速模板网站建设、高性价比邵武网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式邵武网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖邵武地区。费用合理售后完善,10多年实体公司更值得信赖。
开始-
输出-
首先用VS2008/VS2005建立一个SQL Server项目,右键解决方案添加新项
点击“确定”按钮后,SQL Server项目会要求连接一个数据库,我们可以选择一个数据库
然后在工程中加入一个聚合类(joinstr.cs),如图
joinstr.cs中的最终代码如下:
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Text;
[Serializable]
[SqlUserDefinedAggregate(
Format.UserDefined, //use custom serialization to serialize the intermediate result
IsInvariantToNulls = true, //optimizer property
IsInvariantToDuplicates = false, //optimizer property
IsInvariantToOrder = false, //optimizer property
MaxByteSize = 8000), //maximum size in bytes of persisted value
]
public struct JoinStr:IBinarySerialize
{
private StringBuilder sbIntermediate;
public void Init()
{
sbIntermediate = new StringBuilder();
}
public void Accumulate(SqlString Value)
{
if (Value == null || Value.ToString().ToLower().Equals("null"))
{
return;
}
else
{
sbIntermediate.Append(Value);
}
}
public void Merge(JionStr Group)
{
sbIntermediate.Append(Group.sbIntermediate);
}
public SqlString Terminate()
{
return new SqlString(sbIntermediate.ToString());
}
// This is a place-holder member field
#region IBinarySerialize Members
public void Read(System.IO.BinaryReader r)
{
sbIntermediate = new StringBuilder(r.ReadString());
}
public void Write(System.IO.BinaryWriter w)
{
w.Write(this.sbIntermediate.ToString());
}
#endregion
}
在编写完上述代码后,可以使用Visual Studio来部署(右向工程,在弹出菜单上选“部署”即可)。
在执行上面的SQL语句之前,需要将SQL Server2005的clr功能打开
现在可以使用joinstr来聚合字符串了。
select [t_code_role].[role_mc] as '角色',dbo.JoinStr([t_code_right].[right_mc]+',') as '权限' from [t_data_roleright],[t_code_right],[t_code_role] where [t_data_roleright].[role_bm]=[t_code_role].[role_bm] and [t_data_roleright].[right_bm]=[t_code_right].[right_bm] group by [t_code_role].[role_mc]
不想看的麻烦 直接创建视图,然后按照分页语句查询视图就可以了。最好你可以把视图替换成你的聚合函数,然后删除视图。
我看没人回答我再上。
-----------------------------
这个用子查询就可以了!如果嵌套很多,证明你的数据库设计很蹩脚。
给你个例子:
----------
SELECT TOP 10
convert(varchar(10),K.ID) as ID,
convert(varchar(20),convert(decimal(18,2),K.SumRealSaleCost)) as SumRealSaleCost,
K.CountRes
from
(
select
ROW_NUMBER() OVER (ORDER BY GetDate()) AS ID,
(sum(M.Sale) over()-sum(M.ReturnSaleCost) over()) as SumRealSaleCost,
count(*) over() as CountRes
from
(
---这里你爱用什么聚合函数就用什么聚合函数,我只用了一个简单的子查询而已!
select
A.Sale,
A.ReturnSaleCost
from ProductStore A
) M
) K
where K.ID ?
--这个排序最好和分页函数一致。
ORDER BY K.Sale DESC
--------------------
最外层为类型转化层
中间是数据逻辑层
最内层就是集合构建层
我这种写法很多人不理解,本人原创。你百度不到!
---------------------
如果LZ数据库有功底的话,加入我的团队吧!数据库聚贤庄
SQL
Server中的聚合函数有:
1.count()
所有记录数
2.count(*)所有非null记录数
3.avg()
某一列平均值
4.min()
某一列最小值
5.max()
某一列最大值
6.sum()
某一列总和
使用方法:
1.
SELECT
COUNT(字段1)
FROM
表A
统计字段1在表A中出现的次数
2.
SELECT
学号,SUM(各科成绩)
FROM
student
GROUP
BY
学号
用来根据统计学生的总成绩
sqlserver位运算分享
使用下面脚本,试一试,看看可否?
select sum([col1]|[col1]) from table
这样可以吗?