シーケンスの最初の要素を返す FIRST 集計関数が必要で、それを HAVING 句で使用します。
これは、以前の質問の続きと見なすことができる質問です: FIRST 集計関数を HAVING 句で使用できます。
集計関数だけが私の問題を解決できることが判明したので、作成しようとしました:
[Serializable]
[SqlUserDefinedAggregate(
    Format.UserDefined, //use clr 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 GetFirst : IBinarySerialize {
    private string allValues;
    public void Init() {
        allValues = string.Empty;
    }
    private void incrementAndAdd(SqlInt32 value) {
        allValues += (value.Value.ToString() + ",");
    }
    public void Accumulate(SqlInt32 Value) {
        incrementAndAdd(Value);
    }
    public void Merge(GetFirst Group) {
    }
    public SqlInt32 Terminate() {
        // Put your code here
        return new SqlInt32(int.Parse(allValues.Split(',')[0]));
    }
    // This is a place-holder member field
    private SqlInt32 var1;
    public void Read(System.IO.BinaryReader r) {
        allValues = r.ReadString();
    }
    public void Write(System.IO.BinaryWriter w) {
        w.Write(this.allValues);
    }
}
そして、これが私がそれを使用した方法です:
DECLARE @fooTable AS TABLE(
    ID INT,
    CategoryName NVARCHAR(100),
    Name NVARCHAR(100),
    MinAllow INT,
    Price DECIMAL(18,2)
);
INSERT INTO @fooTable  VALUES(1, 'Cat1', 'Product1', 3, 112.2);
INSERT INTO @fooTable  VALUES(2, 'Cat2', 'Product2', 4, 12.34);
INSERT INTO @fooTable  VALUES(3, 'Cat1', 'Product3', 5, 233.32);
INSERT INTO @fooTable  VALUES(4, 'Cat3', 'Product4', 4, 12.43);
INSERT INTO @fooTable  VALUES(5, 'Cat3', 'Product5', 1, 13.00);
INSERT INTO @fooTable  VALUES(7, 'Cat4', 'Product7', 1, 15.00);
INSERT INTO @fooTable  VALUES(6, 'Cat4', 'Product6', 3, 13.00);
DECLARE @minAllowParam AS INT = 3;
SELECT ft.CategoryName, SUM(ft.Price), dbo.GetFirst(ft.MinAllow) FROM @fooTable ft
GROUP BY ft.CategoryName
HAVING dbo.GetFirst(ft.MinAllow) >= @minAllowParam;
適切な結果が返されることもあれば、返されないこともあり、正しく実装したかどうかはわかりません。私の要件を考慮してこれが正しいとしたら、何か考えはありますか?