0

我正在编写一个查询,该查询创建两个表的联合的聚合,但我需要联合的第二个表来处理一些列(总和),我不确定这样做的确切方法。这不是存储过程的一部分,因此没有变量。详情如下:

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

所以这就是问题所在:表 a 和表 d 中的 col3 是相同的数据,除了表 b 中它是一个总值,每个新添加的行都是根据前一行计算的。(我无法控制这些表)。

在联合之后,表 a 中的 30 左右额外的行被添加到表 d 中的行的末尾,唯一的问题是表 a 不是累积值,它本身就是每行。

理想情况下,在联合期间,我想取表 d 的 col3 值中的最后一行,然后从表 a 添加的第一行将是表 d 的 col3 中的 val +/- 表 a 的 col3 中的值。

我希望我对此进行了充分的解释,我知道有办法做到这一点,我只是不确定如何应用它。

以下是两个物理表的示例,以及输出聚合的外观和应该是什么样的:

表d: 工会的第一张桌子

表一:

联合中的第二张桌子

输出表:REDISH 行来自表 d,而 BLUE 来自表 a。

最终输出(聚合)

4

1 回答 1

0

好的,我有点好奇你真正想要什么样的输出,因为即使蓝色的东西是正确的,我也无法想象你给出的示例结果的用途,所以我想建议一种方法来获得纠正蓝色的东西,让你决定是否要包括红色的东西。

我们需要识别表 A 中的列,除了 col3 不是 col3 但实际上是 col3 的总和,用于标识表 D 中数据类型的任何列,我假设它是列 TYPE。由于此运行总计需要包含先前的数据而不是后续数据,因此我们还需要某种日期时间或序列列,因此我将此列称为 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 

这有帮助吗?

于 2012-08-15T00:01:08.837 回答