我的表格如下:
ID | ItemID | ItemQualityID | Amount | UnitPrice
我的目标是根据ItemID
累积总和找到每个ItemQualityID
+ Amount
对的前x%行,并按UnitPrice
排序。
例如:
ID | ItemID | ItemQualityID | Amount | UnitPrice
1 1 1 18 2
2 1 1 1 1
3 1 1 1 1
4 2 1 18 2
5 2 1 1 1
6 2 1 1 1
7 1 1 1 3
我希望前10%,然后结果表应包含第2,3,5,6行。由于ItemID 1和2的总金额分别为21和20,因此10%将分别为2项。如果我想要前20%,那么结果表应该仍然是相同的,因为如果我包括第1行和第4行,它将使它成为100%。第7行的单价>第1行,所以如果不包括第1行,那么第7行也不应该被包括在内。
理想情况下,我希望该表包含所有已过滤的行以进行其他计算,但即使我只能得到过滤表的Amount * UnitPrice之和,我也会很高兴。像
这样的东西ItemID | ItemQualityID | Sum
1 1 2
2 1 2
对于上面的例子。
答案 0 :(得分:2)
您可以使用SUM OVER
:
DECLARE @percent DECIMAL(5, 2) = .1
;WITH CteSum AS(
SELECT *,
TotalSum = SUM(Amount) OVER(PARTITION BY ItemID, ItemQualityID),
CumSum = SUM(Amount) OVER(PARTITION BY ItemID, ItemQualityID ORDER BY UnitPrice, ID)
FROM tbl
)
SELECT
ItemID,
ItemQualityID,
[Sum] = SUM(Amount * UnitPrice)
FROM CteSum
WHERE CumSum <= @percent * TotalSum
GROUP BY ItemID, ItemQualityID