2013-04-11 9 views
3

У меня проблема в запросе select sql server. У меня есть следующая таблица.Сумма столбца в запросе выбора

ID-----Name----Quantity 
1-------a-----------10 
2-------b-----------30 
3-------c-----------20 
4-------d-----------15 
5-------e-----------10 
6-------f-----------30 
7-------g-----------40 

Я хочу выбрать те записи, где сумма Количество < значение. Например, если я говорю выбрать те записи, где количество сумма < 65, то выход будет

ID-----Name----Quantity 
1-------a-----------10 
2-------b-----------30 
3-------c-----------20 

, потому что если мы включаем следующую запись то сумма будет 75. Количество

Я хочу, чтобы создать этот запрос. Пожалуйста, помогите мне.

+2

Mysql или SQL Server ?? Почему вы отметили его как тегами? –

ответ

5

Для этого вы можете просто использовать коррелированный подзапрос, и он отлично подходит для MySQL и SQL Server. Но это не самое лучшее исполнение мудрое решение:

SELECT 
    ID, 
    Name, 
    Quantity 
FROM 
(
    SELECT 
    t1.ID, 
    t1.Name, 
    t1.Quantity, 
    (SELECT SUM(t2.Quantity) 
    FROM tablename AS t2 
    WHERE t2.ID <= t1.ID) AS Total 
    FROM Tablename AS t1 
) AS t 
WHERE Total < 65; 

в действии:

Это даст вам:

| ID | NAME | QUANTITY | 
------------------------ 
| 1 | a |  10 | 
| 2 | b |  30 | 
| 3 | c |  20 | 
2

Лучшая производительность мудрая решение использует рекурсивный CTE.

WITH CTE_Prepare AS 
(
    SELECT 
     *, 
     ROW_NUMBER() OVER (ORDER BY id) AS RN 
    FROM TableRT 
) 
, CTE_Recursive AS 
(
    SELECT ID, Name, Quantity, QUantity AS SumQuantity, RN FROM CTE_Prepare WHERE RN = 1 
    UNION ALL 
    SELECT p.ID, p.Name, p.Quantity, r.SumQuantity + p.Quantity AS SumQuantity, r.RN + 1 AS RN FROM CTE_Recursive r 
    INNER JOIN CTE_Prepare p ON p.RN = r.RN+1 
    WHERE r.SumQuantity + p.Quantity < 65 
) 
SELECT * 
FROM CTE_Recursive 
OPTION (MAXRECURSION 0) 

Первый КТР просто вычислить ROW_NUMBERS использовать вместо ваших идентификаторов, потому что это важно, чтобы не иметь пробелов и мы не можем быть уверены, что, как правило, с какой-либо ID, что это было бы дело.

Второй CTE является двухкомпонентным рекурсивным, добавляя количество для каждой следующей строки. Если потребуется, вы можете google о рекурсивных CTE SQL Server.

Я думаю, что это лучше, чем любой другой подход к поиску текущих итогов (это то, что называется этим понятием), потому что оно работает только с двумя строками в то время - не добавляя все предыдущие строки для каждого вычисления, и оно фактически прекращается как только он достигает желаемого знака.

SQLFiddle - few rows sample

SQLFiddle - 10000 rows

EDIT: Исправлено несколько ошибок. Чтобы это было быстро, предложение WHERE должно быть внутри CTE, а не снаружи.

Смежные вопросы