我一直在尋找使用CLR聚合來對一系列數據執行一些複雜的財務計算,但是儘管閱讀了很多關於這個主題的文章和很多的小技巧,我還是不太明白。SQL Server 2008 CLR聚合函數
我的輸入是一系列的日期和價值觀,我希望能夠做到以下幾點:
SELECT dbo.FinancialCalc(amount, date)
FROM (VALUES
(-100000, '11/30/2011'),
(-50000, '3/15/2012'),
(-2500, '7/18/2012')
) n(amount, date)
這是到目前爲止我的代碼:
[SqlUserDefinedAggregate(Format.UserDefined, MaxByteSize = 8000, Name = "FinancialCalc", IsInvariantToDuplicates = false, IsInvariantToNulls = true, IsInvariantToOrder = true, IsNullIfEmpty = true)]
[Serializable]
[StructLayout(LayoutKind.Sequential)]
public class FinancialCalc : IBinarySerialize
{
private List<Transaction> transactions;
private List<DateTime> dates;
private List<Double> values;
public void Init()
{
this.transactions = new List<Transaction>();
this.dates = new List<DateTime>();
this.values = new List<double>();
}
public void Accumulate(SqlDouble amount, SqlDateTime date)
{
this.dates.Add(date.Value);
this.values.Add(amount.Value);
}
public void Merge(FinancialCalc Group)
{
//is this needed?
}
public SqlDouble Terminate()
{
//here is where I would do the calc: return transactions.Calculate() or somethine
return values.Sum();
}
public void Read(System.IO.BinaryReader r)
{
int itemCount = r.ReadInt16();
for (int i = 0; i <= itemCount - 1; i++)
{
this.values.Add(r.ReadDouble());
}
}
public void Write(System.IO.BinaryWriter w)
{
w.Write(this.values.Count);
foreach (double s in this.values)
{
w.Write(s);
}
}
}
如何順利拿到將SQL查詢中的數據放入List<Transaction>
以便我可以處理它並返回計算的值?
你需要日期和值的列表,或者就是你到目前爲止所擁有的?你想要的只是一個(任意)'Transaction'對象列表嗎? 「Transaction」對象是什麼樣的? –
那些其他列表僅供測試 - 交易是我所需要的。交易看起來像'公共類交易 { 公共double值{獲得;設置;} 公衆的DateTime日期{獲取;集;}} ' 所以 – woggles
,類似於我的回答假設的一個。所有需要改變的地方(如果你不想改變你的'Transaction'定義以符合我的要求)就是使用對象初始值設置語法,而不是我在「Accumulate」和「Read」中設想的構造函數。 –