2015-04-17 5 views
1

У меня есть таблица:Как получить первые N строк, где сумма ≥ X?

  • Продукты (ID, вес, истек, ...)

Я хотел бы получить N первых продуктов с истекшим сроком годности, который является ложным и сумма веса форма example >= 5kg.

Как я могу выполнить этот запрос?

Большое спасибо.

EDIT: кажется, что я был не очень ясен в своем вопросе. Например, у меня могут быть следующие продукты:

  • p1: ID = 1, weight = 1;
  • p2: ID = 2, вес = 1;
  • p3: ID = 3, вес = 1;
  • p4: ID = 4, вес = 2;

Например, я хотел бы получить первые N продуктов, сумма которых равна 3. Оформить заказ.

Поэтому я хотел бы получить, например, p1, p2 и p3, потому что сумма весов равна 3 (в этом случае N равно 3, потому что мне нужны 3 продукта), поэтому это правильно. Я мог бы получить p1 и p4, и это было бы правильно (в этом случае N равно 2, потому что мне нужны только два продукта), или p2 и p4 ... и так далее.

+0

выбрать верхний N ... где ... заказ by ...? – jarlh

+0

Что означает 'СУММЫ веса 'в этом контексте? Что вы хотите суммировать? Как можно суммировать одну запись? –

+0

Непонятно, чего именно вы хотите достичь здесь. Можете ли вы, по крайней мере, показать нам пример ввода и желаемого вывода? Показывая, что основой для запроса, который у вас уже есть, вероятно, также будет полезно. –

ответ

3

Вы можете написать по адресу:

select top 10 * from -- top N goes here 
(
SELECT *,SUM(weight) OVER (partition BY expired ORDER BY Id asc) as cumulativesum 
FROM 
Products 
WHERE expired = 0 
)T 
    where cumulativesum>=5 

DEMO

+0

Большое спасибо за демо, бит у меня есть сомнения. Первый результат говорит: ID = 3 и кумулятивный = 5. Если строка с ID = 3 имеет вес 4, как возможно, что суммарная сумма равна 5? –

0
SELECT TOP 10 p.* 
FROM Prodcts p 
WHERE p.expired = 0 
AND p.weight >= 5 

Однако, в настоящее время не ясно, как вы хотите sum одной записи.

0

Для того, чтобы отфильтровать данные по столбцу/выражению, вам необходимо использовать пункт WHERE. Например:

SELECT * 
FROM DataSource 
WHERE column = 0 -- or column = 'false' 

Для того чтобы отфильтровать данные по совокупному выражению, вам нужно использовать HAVING пункт. Например:

SELECT * 
FROM DataSource 
WHERE column = 0 -- or column = 'false' 
HAVING SUM(something) > 100 

Для того, чтобы получить TOP записи то, что вы должны использовать соответствующий ORDER BY пункт либо - вам нужно сортировать данные таким образом, что TOP N всегда даст вам те же результаты.

0

Если вам нужно суммировать вес, который является тем, что ваш вопрос подразумевает, попробовать что-то вроде

Select ID, [Weight] 
From 
(select ID, SUM([weight]) as [weight], Row_number() over(order by ID) as N 
Where Expired = 0 
Having SUM(weight) > = 5) X 
where N <= @x 

Или, если вы хотите, самый тяжелый первый

Select ID, [Weight] 
From 
(select ID, SUM([weight]) as [weight], Row_number() over(order by SUM([weight]) desc) as N 
Where Expired = 0 
Having SUM(weight) > = 5) X 
where N <= @x 

Где @X это номер, который требуется

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