Sql Server自定義聚合函數(shù)詳細(xì)步驟
創(chuàng)新互聯(lián)是一家專注于成都網(wǎng)站制作、網(wǎng)站設(shè)計與策劃設(shè)計,紅橋網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十多年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:紅橋等地區(qū)。紅橋做網(wǎng)站價格咨詢:13518219792
開始-
輸出-
首先用VS2008/VS2005建立一個SQL Server項目,右鍵解決方案添加新項
點(diǎn)擊“確定”按鈕后,SQL Server項目會要求連接一個數(shù)據(jù)庫,我們可以選擇一個數(shù)據(jù)庫
然后在工程中加入一個聚合類(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來部署(右向工程,在彈出菜單上選“部署”即可)。
在執(zhí)行上面的SQL語句之前,需要將SQL Server2005的clr功能打開
現(xiàn)在可以使用joinstr來聚合字符串了。
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]
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)計字段1在表A中出現(xiàn)的次數(shù)
2.
SELECT
學(xué)號,SUM(各科成績)
FROM
student
GROUP
BY
學(xué)號
用來根據(jù)統(tǒng)計學(xué)生的總成績
我看沒人回答我再上。
-----------------------------
這個用子查詢就可以了!如果嵌套很多,證明你的數(shù)據(jù)庫設(shè)計很蹩腳。
給你個例子:
----------
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
(
---這里你愛用什么聚合函數(shù)就用什么聚合函數(shù),我只用了一個簡單的子查詢而已!
select
A.Sale,
A.ReturnSaleCost
from ProductStore A
) M
) K
where K.ID ?
--這個排序最好和分頁函數(shù)一致。
ORDER BY K.Sale DESC
--------------------
最外層為類型轉(zhuǎn)化層
中間是數(shù)據(jù)邏輯層
最內(nèi)層就是集合構(gòu)建層
我這種寫法很多人不理解,本人原創(chuàng)。你百度不到!
---------------------
如果LZ數(shù)據(jù)庫有功底的話,加入我的團(tuán)隊吧!數(shù)據(jù)庫聚賢莊
SQL SERVER中聚合函數(shù)主要有:
(1)求員工總?cè)藬?shù)
(2)求最大值,求最高工資
(3)求最小時,求最小工資
(4)求和,求所有員工的工資總和
(5)求平均值,求所有員工的平均工資
ROUND函數(shù)用法:
(6)求數(shù)量,最大值,最小值,總和,平均值,在一行顯示
(7)查詢出武漢地區(qū)的員工人數(shù),總工資,最高工資,最低工資和平均工資
(8)求出工資比平均工資高的人員信息
(9)求數(shù)量,年齡最大值,年齡最小值,年齡總和,年齡平均值,在一行顯示
(10)計算出月薪在10000 以上的男性員工的最大年齡,最小年齡和平均年齡
(11)統(tǒng)計出所在地在“武漢或上?!钡乃信畣T工數(shù)量以及最大年齡,最小年齡和平均年齡
(12)求出年齡比平均年齡高的人員信息
GETDATE() 返回當(dāng)前的日期和時間
DATEPART() 返回日期/時間的單獨(dú)部分
DATEADD() 返回日期中添加或減去指定的時間間隔
DATEDIFF() 返回兩個日期直接的時間
DATENAME() 返回指定日期的指定日期部分的整數(shù)
CONVERT() 返回不同格式的時間
示例:
時間格式控制字符串: