2016-12-05 102 views
-1

有一些問題找到一個答案,我認爲是一個簡單的查詢前N行,但我很綠色的SQL:總結使用WHERE語句

YR MO ID FLAG RETURN 
2001 01 1 1  3.00 
2001 02 1 2  4.00 
2001 03 1 3 -1.00 
2001 04 1 4  1.00 
2001 05 1 5  1.00 
2001 06 1 6  1.00 
2001 07 1 7  1.00 
2001 08 1 8  1.00 
2001 09 1 9  1.00 
2001 10 1 10 1.00 
2001 11 1 11 2.00 
2001 12 1 12 1.00 
2002 12 2 3  1.00 
2002 04 2 0  0.05 

我想接下來要總結新列前面的12 RETURNWHERE FLAG = 12。任何幫助是極大的讚賞!

數據將按ID,然後YearMonth排序,因此它應按順序排列。

輸出將(3+4+-1+1+1+1+1+1+1+1+2+1) = 16

我想在FLAG輸出(16)= 12行

+0

是您按年份和月份進行「上一頁12返回值」排序? 'ID'是否符合該順序? – JNevill

+1

你的問題表明數據有某種順序。訂單是什麼?此外,您只需標記您實際使用的DBMS。對於mysql和sql server來說,查詢會有很大的不同。你實際使用哪一個?如果您可以提供足夠的樣本數據,以便我們可以看到您正在嘗試做什麼,並且您期望的結果將幫助我們知道我們是否甚至可以解決您所問的問題。 –

+0

添加適當的樣本數據和預期數據。最重要的是你正在使用Mysql的數據庫管理系統DBMS# –

回答

1

也許一個窗口函數會適合這裏的法案:

SELECT *, CASE WHEN FLAG = 12 THEN SUM([RETURN]) OVER (PARTITION BY ID ORDER BY YR, MO ROWS BETWEEN 12 PRECEDING AND CURRENT ROW) ELSE NULL END 
FROM SomeTable 
ORDER BY ID, YR, MO 
1

因此,有你正在嘗試什麼一對夫婦的問題。首先,您需要以編程方式或通過管理方式(通過用戶界面)創建新列;選擇呼叫不會爲你做這件事。接下來,您需要確定您需要在架構中使用這些數據,因爲如果有一個列標記值的列會非常「奇怪」。看起來好像你想知道結果,但不一定需要存儲它。如果這是真的(或可以成立),那麼我會建議創建一個select調用,使用'sum','order by ... desc'(這意味着您需要知道排序)和'limit 12'功能。鑑於Flag爲12的任何行,您應該能夠通過一次調用就能得到您想要的結果。

只是另一個說明,因爲您提到了兩個不同的DBMS,請確保您針對兩者都驗證了SQL;我相當肯定你可以找到一個可以在兩個系統中工作的通用請求。祝你好運。

+0

Hi @Gene你是對的,我不想改變現有的數據庫。我也在使用SQL Server並更新了這篇文章。不幸的是,2012年之前沒有LIMIT功能(使用2008)。我想要以下內容:SELECT [年],[月],[ID],[返回],SUM(返回)ORDER BY標識符,年,月LIMIT 12 – user2977664

+1

看起來像randcd的解決方案得到你很接近LIMIT功能)。根據你的SQL Server版本,這篇文章似乎有一些很好的選擇。 http://stackoverflow.com/questions/971964/limit-10-20-in-sql-server – Gene