Sql Server自定義聚合函數(shù)詳細(xì)步驟
創(chuàng)新互聯(lián)-專(zhuān)業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性?xún)r(jià)比邵武網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式邵武網(wǎng)站制作公司更省心,省錢(qián),快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋邵武地區(qū)。費(fèi)用合理售后完善,10多年實(shí)體公司更值得信賴(lài)。
開(kāi)始-
輸出-
首先用VS2008/VS2005建立一個(gè)SQL Server項(xiàng)目,右鍵解決方案添加新項(xiàng)
點(diǎn)擊“確定”按鈕后,SQL Server項(xiàng)目會(huì)要求連接一個(gè)數(shù)據(jù)庫(kù),我們可以選擇一個(gè)數(shù)據(jù)庫(kù)
然后在工程中加入一個(gè)聚合類(lèi)(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
}
在編寫(xiě)完上述代碼后,可以使用Visual Studio來(lái)部署(右向工程,在彈出菜單上選“部署”即可)。
在執(zhí)行上面的SQL語(yǔ)句之前,需要將SQL Server2005的clr功能打開(kāi)
現(xiàn)在可以使用joinstr來(lái)聚合字符串了。
select [t_code_role].[role_mc] as '角色',dbo.JoinStr([t_code_right].[right_mc]+',') as '權(quán)限' 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]
不想看的麻煩 直接創(chuàng)建視圖,然后按照分頁(yè)語(yǔ)句查詢(xún)視圖就可以了。最好你可以把視圖替換成你的聚合函數(shù),然后刪除視圖。
我看沒(méi)人回答我再上。
-----------------------------
這個(gè)用子查詢(xún)就可以了!如果嵌套很多,證明你的數(shù)據(jù)庫(kù)設(shè)計(jì)很蹩腳。
給你個(gè)例子:
----------
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
(
---這里你愛(ài)用什么聚合函數(shù)就用什么聚合函數(shù),我只用了一個(gè)簡(jiǎn)單的子查詢(xún)而已!
select
A.Sale,
A.ReturnSaleCost
from ProductStore A
) M
) K
where K.ID ?
--這個(gè)排序最好和分頁(yè)函數(shù)一致。
ORDER BY K.Sale DESC
--------------------
最外層為類(lèi)型轉(zhuǎn)化層
中間是數(shù)據(jù)邏輯層
最內(nèi)層就是集合構(gòu)建層
我這種寫(xiě)法很多人不理解,本人原創(chuàng)。你百度不到!
---------------------
如果LZ數(shù)據(jù)庫(kù)有功底的話(huà),加入我的團(tuán)隊(duì)吧!數(shù)據(jù)庫(kù)聚賢莊
SQL
Server中的聚合函數(shù)有:
1.count()
所有記錄數(shù)
2.count(*)所有非null記錄數(shù)
3.avg()
某一列平均值
4.min()
某一列最小值
5.max()
某一列最大值
6.sum()
某一列總和
使用方法:
1.
SELECT
COUNT(字段1)
FROM
表A
統(tǒng)計(jì)字段1在表A中出現(xiàn)的次數(shù)
2.
SELECT
學(xué)號(hào),SUM(各科成績(jī))
FROM
student
GROUP
BY
學(xué)號(hào)
用來(lái)根據(jù)統(tǒng)計(jì)學(xué)生的總成績(jī)
sqlserver位運(yùn)算分享
使用下面腳本,試一試,看看可否?
select?sum([col1]|[col1])?from?table
這樣可以嗎?