2015-04-17 17 views
1

我有表:如何獲得總和≥X的前N行?

  • 產品(ID,體重,過期,...)

我想獲得其到期N個第一的產品是假的,重量的總和形式example >= 5kg

我怎麼能做這個查詢?

非常感謝。

編輯:似乎我不是很清楚我的問題。例如我可以有這樣的產品:

  • p1:ID = 1,weight = 1;
  • p2:ID = 2,weight = 1;
  • p3:ID = 3,權重= 1;
  • p4:ID = 4,weight = 2;

例如,我想獲得權重總和爲3的前N個產品。順序是相同的。

所以我想得到例如p1,p2和p3,因爲權重的總和是3(在這種情況下N是3,因爲我需要3個產品),所以它是正確的。我可以得到p1和p4,這是正確的(在這種情況下,N是2,因爲我只需要兩種產品),或者p2和p4 ...等等。

+0

select top N ... where ... order 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是多少需要