日期:2014-05-17  浏览次数:20990 次

GROUP BY 如何处理计算得到的值
请教使用GROUP BY 如何处理计算得到的值?能不能这样使用?

select ROW_NUMBER() OVER(ORDER BY sum(c.H_EVAL) DESC) RID,
sum(c.H_EVAL),
round(sum(c.H_EVAL)/p.P_TOTALNAV*100,2),--这里在GROUP BY里面该如何处理
a.S_I_CODE1,b.S_I_NAME1 
from TSTK_INDUSTRY_SW a ,TSTK_INDUSTRY1_ENUM_SW b,VCRP_HLD c,VCRP_NAV p
where c.I_CODE=a.I_CODE and b.S_I_CODE1=a.S_I_CODE1
and c.P_ID = 323 And c.BEG_DATE <= '2010-01-01' And c.END_DATE >'2010-01-01'
and p.P_ID = 323 And p.BEG_DATE <= '2010-01-01' And p.END_DATE >'2010-01-01'
and a.S_I_CODE1 in(select distinct S_I_CODE1 from TSTK_INDUSTRY_SW) 
group by a.S_I_CODE1,b.S_I_NAME1 --??
order by sum(c.H_EVAL) DESC

------解决方案--------------------
你说的是PARTITION BY?分析函数的分组
------解决方案--------------------
字段如果不在SUM等聚合函数参数里的字段,必须包含在group by中,
如果加在group by 中不合逻辑,你可以使用子查询嵌套
------解决方案--------------------
round(sum(c.H_EVAL)/p.P_TOTALNAV*100,2),--这里在GROUP BY里面该如何处理
根据p.P_TOTALNAV的含义 把p.P_TOTALNAV加上MAX(),MIN(),SUM()修饰看看


------解决方案--------------------
聚合函数sum,count,avg之类的group by中必须含有所有没有被聚合的字段
group by a.S_I_CODE1,b.S_I_NAME1,p.P_TOTALNAV这样就可以了
如果你查询的意图不是这样,就要在p.P_TOTALNAV这个字段上处理下