2012-08-14 162 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 

这有帮助吗?