我有一个奇怪的要求,我需要在SQL Server 2008 R2我的存储过程中使用。
我需要第一聚合函数返回一个序列的第一个元素,我将使用与HAVING
子句。
让我给你举个例子:
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);
记录具有1为值MinAllow
列,但是该序列的第二个元素。 所以,是的Cat3安全,可以选择。
注:
MIN
或MAX
是不是我期待的!
我知道,这个例子在逻辑上没有什么意义,但我有一个情况,它完全不和难以解释这里的另一方面。
有什么想法吗?
编辑:
我假设我能达到什么我想在这里通过创建一个CLR用户定义的聚合功能,但我不想这样做,如果有任何其他的选择