2011-08-25 83 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