对旧/新记录的聚合查询问题

时间:2016-01-25 23:11:39

标签: sql oracle

这是我的sql生锈的情况,我有一个包含旧记录和新记录的表,我试图将一个聚合查询放在一起,根据从较新值中减去较旧值的总和来计算值。我不确定需要什么来使这个工作,也许是一个小组?

我编辑了这个并删除了一些冗余。我只是试图通过其他记录中某些列值的总和来获取列的行值的差异。

SELECT 'key',  
'NEW',  
NVL(n.MyFirstAmt,0) - SUM(NVL(o.MyFirstAmt,0)),  
NVL(n.MySecondAmt,0) - SUM(NVL(o.MySecondAmt,0)),    
SYSDATE,  
'MYUSER',  
SYSDATE,  
'MYUSER',  
o.SOME_COLUMN,  
FROM TABLE o, TABLE n  
WHERE o.id IN (1,2,3)  
AND n.id = 4

- GROUP BY ???

2 个答案:

答案 0 :(得分:0)

您 可以尝试使用分析(over)函数:

NVL(n.MyFirstAmt,0) - SUM(NVL(o.MyFirstAmt,0) over() )

答案 1 :(得分:0)

这是在黑暗中完全拍摄的......在我看到选择查询中的o.SOME_NO值之前,我认为我理解了这个问题 - 您对这些值的意图是什么?

从表面上看,这似乎就像你想要做的那样,但我真的被抛出一个关于如何从“旧”数据中提取SOME_NO字段的循环。

with old_data as (
  select
    sum (coalesce (MyFirstAmt, 0)) as MyFirstAmt,
    sum (coalesce (MySecondAmt, 0)) as MySecondAmt,
    sum (coalesce (MyThirdAmt, 0)) as MyThirdAmt,
    sum (coalesce (MyFourthAmt, 0)) as MyFourthAmt,
    sum (coalesce (MyFifthAmt, 0)) as MyFifthAmt
  from table
  where id in (4220621729,4201771785,4184084016)
)
select
  coalesce (n.MyFirstAmt, 0) - o.MyFirstAmt,
  coalesce (n.MySecondAmt, 0) - o.MySecondAmt,
  coalesce (n.MyThirdAmt, 0) - o.MyThirdAmt,
  coalesce (n.MyFourthAmt, 0) - o.MyFourthAmt,
  coalesce (n.MyFifthAmt, 0) - o.MyFifthAmt
from
  table n,
  old_data o
where
  n.id = 80002696860

另外,我假设这里的笛卡儿加入是故意的。由于子查询是一行,它似乎没有抛出任何警告耀斑。