2012-08-14 151 views
0

我正在寫一個查詢,創建兩個表的聯合的聚合,但我需要聯合的第二個表有一些列(總和)編輯,我不是確切地說,要做到這一點。這不是一個存儲過程的一部分,所以沒有變量。詳情如下:SQL Server動態計算總和

select t.col1, t.col2, t.col3 FROM (
    select d.col1, d.col2, d.col3 FROM table1 d 
    join another_table 
     on ... 
    join different table 
     on ... 

    UNION ALL 

    select a.col1, a.col2, a.col3 FROM table2 a 
     join another_table 
      on ... 
     join different table 
      on ... 
    WHERE 
     /*datetime restricitons */ 

) t 

因此,這是該問題:COL3在表a和d是相同的數據,除了在表B中它是一個總價值,與被計算的基於增加每個新行以前的。 (我無法控制這些表格)。

聯合之後,來自表a的30行左右額外的行被添加到表d的行末尾,唯一的問題是表a不是累積值,而是它自己的每行。

理想情況下,在工會期間,我想要取出表格的col3值中的最後一行,然後從表格a添加的第一行應該是表格d'col3中的val +/-表格col3中的值一個。

我希望我充分解釋這一點,我知道有一種方法可以做到這一點,我只是不知道如何應用它。

這裏有兩個物理表的例子,什麼輸出總量的樣子,它應該是什麼樣子:

表d: first table in union

表:

second table in union

輸出表: REDISH行來自表d,而BLUE來自表a。

end output (aggregate)

+0

不知道我是否完全明白你的意思,但是我會因爲這件事而快速而骯髒地受到誘惑。聲明一個局部變量選擇正確的值,然後在需要它的地方使用它。 – 2012-08-14 20:47:31

+0

提示:相關的子查詢...看到這個線程中的最後一個答案不完整的答案,但提示http://stackoverflow.com/questions/1153879/how-do-i-calculate-a-running-total-in-sql -without-use-a-cursor – ClearLogic 2012-08-14 20:47:35

+1

你能提供一些示例數據和輸出結果嗎? – 2012-08-14 21:12:15

回答

0

OK,我有點好奇,你真正想要什麼樣的輸出,因爲我無法想象的例如使用的結果,你給了即使藍色的東西是正確的,所以我D喜歡提出一種獲得正確的藍色東西的方法,並讓你決定是否要包括紅色的東西。

我們需要確定表A中的列,但col3不是col3,而是實際上是col3的運行總數,用於標識表D中數據類型的任何列,我將假設它是列類型。由於這種運行總計需要結合之前的數據,但沒有後續的數據,我們還需要某種形式的datetime或順序列,所以現在我會打電話給此列DATE

select alias_a.ID, alias_a.TYPE, alias_a.DATE, sum(b.VALUE) as Accum 
from a alias_a join (
    select TYPE, col3 as VALUE from a where DATE <= alias_a.DATE 
    ) b ON alias_a.TYPE = b.TYPE 

這一數據可以與加盟表D得到的數據:

select d.TYPE, ..., x.ID, x.DATE, (d.col3 + x.Accum) as RUNNING_TOTAL 
from d join (
    select alias_a.ID, alias_a.TYPE, alias_a.DATE, sum(b.VALUE) as Accum 
    from a alias_a join (
     select TYPE, col3 as VALUE from a where DATE <= alias_a.DATE 
     ) b ON alias_a.TYPE = b.TYPE 
) x on d.TYPE = x.TYPE 
order by d.TYPE, x.DATE 

這有幫助嗎?