2016-12-05 67 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