SQL Server 2008 R2 のストアド プロシージャ内で使用する必要がある奇妙な要件があります。
シーケンスの最初の要素を返す FIRST 集計関数が必要であり、それを withHAVING
句で使用します。
例を挙げましょう:
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', 2, 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);
DECLARE @minAllowParam AS INT = 3;
SELECT ft.CategoryName, SUM(ft.Price) FROM @fooTable ft
GROUP BY ft.CategoryName;
ご覧のとおり、テーブルといくつかのダミー値があります。クエリ内でSELECT
、カテゴリをグループ化し、製品の価格を合計します。
このクエリは次の結果を返します。
CategoryName TotalPrice
---------------- ----------------
Cat1 345.52
Cat2 12.34
Cat3 25.43
ここで必要なのは次のようなものです。
SELECT ft.CategoryName, SUM(ft.Price) FROM @fooTable ft
GROUP BY ft.CategoryName
HAVING GetFIRST(MinAllow) >= @minAllowParam;
このようなクエリの場合、次の結果を選択できるはずです。
INSERT INTO @fooTable VALUES(2, 'Cat2', 'Product2', 4, 12.34);
INSERT INTO @fooTable VALUES(4, 'Cat3', 'Product4', 4, 12.43);
INSERT INTO @fooTable VALUES(5, 'Cat3', 'Product5', 1, 13.00);
INSERT INTO @fooTable VALUES(1, 'Cat1', 'Product1', 2, 112.2);
レコードはシーケンスの最初の要素であり、列の値は 2 であるため、MinAllow
Cat1はここでは範囲外にする必要があります。一方、INSERT INTO @fooTable VALUES(5, 'Cat3', 'Product5', 1, 13.00);
record はMinAllow
column の値が 1 ですが、シーケンスの 2 番目の要素です。というわけで、Cat3が安心して選択できます。
注:
MIN
orMAX
は私が探しているものではありません!
この例は論理的には意味をなさないことはわかっていますが、一方では完全に意味があり、ここで説明するのが難しい状況があります。
何かご意見は?
編集:
CLR User-Defined Aggregate Function を作成することで、ここで必要なことを達成できると想定していますが、他に選択肢がある場合はこれを実行したくありません