2014-05-19 50 views
0

我有一些麻烦与此查询:但是查询不分组由什么我想

NODE_ID    SUM(CVA.CVA) SUM(DVA.DVA) DEAL_NUMADM DEAL_NUMMAS 
MA10700_1731413  953180   1373440   22012  10700 
Master10700_1731413 4886330   4318999   0   10700 
MA10700_1731413  1654   1192   12054  10700 
MA10700_1731413  4    (null)   83442  10700 
MA10700_1731413  14    1093   10775  10700 
MA10700_1731413  963    (null)   10779  10700 

,我希望将这些行由DEAL_NUMMAS,所以:

select 
case 
    when d.deal_numadm!=0 and d.deal_numadm is not null 
     then 'MA' || d.deal_nummas || '_' || d.ntt_id 
    when d.deal_numadm=0 or d.deal_numadm is null 
     then 'Master' || d.deal_nummas || '_' || d.ntt_id 
end as node_id, 
sum(cva.cva), sum(dva.dva), d.deal_numadm, d.deal_nummas 
from acc_processed_cva cva 
left outer join acc_processed_dva dva on dva.deal_id = cva.deal_id 
join acc_deals d on d.deal_id = cva.deal_id and d.deal_scope='Y' 
join dt_runs r on r.run_id = cva.run_id and r.deal_cnt_id = d.deal_cnt_id 
where r.run_id=57 and d.deal_nummas=10700 and d.ntt_id = 1731413 
group by d.ntt_id, d.deal_nummas, d.deal_numadm, d.deal_cnt_id, d.ntt_id; 

它返回这些行我应该只有两排。

我试图消除在GROUP BY表达d.deal_numadm,但与此错误失败:

ORA-00979: not a GROUP BY expression 00979. 00000 - "not a GROUP BY expression"

澄清

以上,DEAL_NUMADM只存在表明他们是返回的每一行都不相同。

我想是这样的:

NODE_ID    SUM(CVA.CVA) SUM(DVA.DVA) DEAL_NUMMAS 
MA10700_1731413  955815   1375725   10700 
Master10700_1731413 4886330   4318999   10700 

与第一行是行1,3,4,5和6

我如何能实现我想要的结果的总和?

+1

“DEAL_NUMMAS”中只有一个值,您为什么期望结果中有2行?也许你可以简单地在GROUP BY – dnoeth

+0

中删除DEAL_NUMMAS时执行'min(DEAL_NUMMAS)'如果你在选择列表中有'deal_numadm',你也必须按照它的顺序进行分组,如你所见。如果你想为每个'ntt_id'和'deal_nummas'单独一行,那么你必须完全移除'deal_numadm',或者将5个值中的哪一个保留为一个聚合。如果不知道如何解决这个难题,不能真正建议改变。 –

+0

根据您的预期结果看起来好像按node_id分组可以解决您的问题,并尝试从group by子句中删除其他人,除非d.deal_nummas(因为它是您的预期结果)非常必要,您可以在select中使用MAX函数。当你从group-by中删除它时,失败的原因是你需要将它们保留在聚合函数中,或者它们应该出现在group-by子句中。所以明智地计划。 – pushpraj

回答

0

好的,我想通了。我想要的查询:

select 
case 
    when d.deal_numadm!=0 and d.deal_numadm is not null 
     then 'MA' || d.deal_nummas || '_' || d.ntt_id 
    when d.deal_numadm=0 or d.deal_numadm is null 
     then 'Master' || d.deal_nummas || '_' || d.ntt_id 
end as node_id, 
sum(cva.cva), sum(dva.dva) 
from acc_processed_cva cva 
left outer join acc_processed_dva dva on dva.deal_id = cva.deal_id 
join acc_deals d on d.deal_id = cva.deal_id and d.deal_scope='Y' 
join dt_runs r on r.run_id = cva.run_id and r.deal_cnt_id = d.deal_cnt_id 
where r.run_id=57 and d.deal_nummas=10700 and d.ntt_id = 1731413 
group by d.ntt_id, d.deal_nummas, case 
    when d.deal_numadm!=0 and d.deal_numadm is not null 
     then 'MA' || d.deal_nummas || '_' || d.ntt_id 
    when d.deal_numadm=0 or d.deal_numadm is null 
     then 'Master' || d.deal_nummas || '_' || d.ntt_id 
end;