2011-08-25 55 views
2

我有两个表,第一(T1)是一个基数,第一是每个符号的碱值:累积数据在数天中的SQL查询

symbol  value 
------------ ----- 
ABC   1000 
DEF   2000 

第二个表(T2)的SA系列每日期值,即:

date   symbol value 
---------- ------ ----- 
2011-09-01 ABC  100 
2011-09-02 ABC  10 
2011-09-03 ABC  1 

我会需要什么样的查询来获得累计超过几天添加到初始值在第一列中的值列。因此,查询的输出会看起来像

symbol date  total 
------ ---------- ------ 
ABC 2011-09-01 1100 
ABC 2011-09-02 1110 
ABC 2011-09-03 1111 

所以在T1加上inital值小于该列日的所有日期的总和的总和。

这样做的目标数据库是在iSeries

DB2
+0

我不知道DB2,但总的思路就是所谓的**运行总计**,SQL Server的实例:http://geekswithblogs.net/Rhames/archive/ 2008/10/28 /计算运行,总计式-SQL服务器2005 ---的-optimal.aspx。 –

回答

1

的SQL方法

select 
    a.symbol, 
    a.value --current value 
    + COALESCE((select sum(value) 
     from T2 b 
     where 
      b.date < a.date and 
      b.symbol=a.symbol 
     ),0) --sum of history 
    + c.value --initial value 
from 
    t2 a join t1 c on (a.symbol = c.symbol) 
+1

您需要在subselectlect上有一个'COALESCE',或者它返回'null'作为第一行,而不是实际的第一个总数。 –

+0

这起作用。 X-Zero是正确的,你需要在子选择上合并。 –

+0

@ X-Zero:你说得对,谢谢! –

1

你必须使用window functions

SELECT T1.symbol, T2.date, COALESCE(T1.value, 0)+sum(T2.value) over (PARTITION BY T2.symbol ORDER BY T2.date) 
FROM T2 
    LEFT JOIN T1 ON T1.symbol = T2.symbol 
ORDER BY T1.symbol, T2.date 

编辑

作品在PostgreSQL上,根据DB2 9.7 LUW文档它应该工作也在DB2上。

+0

-1:这是无效的语法(至少在DB2上,我期望在任何地方)。我也不相信这会正确地产生预期的结果。 –

+0

Whups:这是DB2中可能无效的语法,具体取决于它运行的硬件和版本 - 例如,在运行iSeries操作系统的AS/400上无效。 (请编辑答案,以便我可以删除我过于仓促的投票) –

+0

我在PostgreSQL 9.0上进行了测试。根据DB2 9.7 LUW文档,它也应该在那里工作。 – Crack