我正在编写一个查询,它创建了两个表的联合的聚合,但是我需要联合的第二个表来编辑一些列(sum),我不确定到做这个。这不是存储过程的一部分,因此没有变量。详情如下:
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不是累积值,它本身就是每行。
理想情况下,在联合期间,我希望获取table d's col3值的最后一行,然后从表a中添加的第一行将是来自table d's col3的val +/-表a中col3的值
我希望我能够充分解释这一点,我知道有办法做到这一点,我只是不确定如何应用它。
以下是两个物理表的示例,以及输出聚合的外观,以及它应该是什么样子:
表d:表d:表a:
输出表: REDISH行来自表d,而BLUE来自表a。
答案 0 :(得分: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
这有帮助吗?