根据累计金额获得前X个百分比

时间:2016-03-29 00:56:10

标签: sql-server tsql sql-server-2014

我的表格如下:

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

对于上面的例子。

1 个答案:

答案 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

ONLINE DEMO