获取记录取决于其总和值

And*_*ier 7 sql sql-server aggregate

我有一个SQL Server表,其中包含这样的记录

ID | 值

1   |   100
2   |   150
3   |   250
4   |   600
5   |   1550
6   |   50
7   |   300
Run Code Online (Sandbox Code Playgroud)

我需要选择随机记录,但唯一的条件是该记录值的总和达到我定义的特定数量或百分比.

假设我需要300或10%的总价值,所以这里有机会

1   |   100
2   |   150
6   |   50
Run Code Online (Sandbox Code Playgroud)

要么

3   |   250
6   |   50
Run Code Online (Sandbox Code Playgroud)

要么

7   |   300
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮助我这样做.

小智 4

认为这个递归 CTE 有效,但不知道一旦你超过了少量的行,性能会是什么样:

DECLARE @Test TABLE
(
    ID INT NOT NULL,
    VAL INT NOT NULL
);

INSERT INTO @Test
VALUES  (1,100),
        (2,150),
        (3,250),
        (4,600),
        (5,1550),
        (6,50),
        (7,300);

DECLARE @SumValue INT = 300,
        @Percentage INT = 10;

WITH GetSums
AS
(
    SELECT  T.ID, 
            T.Val,
            CAST(T.ID AS VARCHAR(MAX)) AS IDs
    FROM    @Test AS T

    UNION ALL

    SELECT  T1.ID, 
            T1.Val + GS.Val AS Val,
            CAST(T1.ID AS VARCHAR(MAX)) + ',' + GS.IDs AS IDs
    FROM    @Test AS T1
    INNER
    JOIN    GetSums AS GS 
            ON  T1.ID > GS.ID
)
SELECT  GS.IDs,
        GS.Val
FROM    GetSums AS GS
WHERE   (GS.Val = @SumValue OR GS.VAL = (SELECT SUM(Val) FROM @Test AS T) / @Percentage)
OPTION  (MAXRECURSION 50);
Run Code Online (Sandbox Code Playgroud)

类似的发现在这里:

查找总和约为某个数字的所有组合