为什么我有义务在一个条件下分组?

时间:2016-07-22 09:21:10

标签: sql oracle case

我正在处理此查询,但我有Error_code:ORA-00979因为我不希望分组用于我在条件中使用的a.year: 有小费吗? 感谢

select 
a.provincia_desc,
a.VOLTAGE_LEVEL,
sum(cnt) / decode(mod(to_number(a.year),4),0,1464,1460) avg
--case 
--when mod(to_number(a.year),4)=0 then sum(cnt)/1464 
--else sum(cnt)/1460 
--end avg
from
(select year ....)a
group by a.provincia_desc,a.VOLTAGE_LEVEL--, a.year
order by avg desc

3 个答案:

答案 0 :(得分:1)

嗯......你写的这个查询没有任何意义。您对所有子查询cnt的数量a求和,然后除以1464或1460的数字,具体取决于"年"是闰年与否,但是"年"不包括在结果中。因此,假设您的子查询a中有2001年和2004年。在结果集中,你没有2001年和2004年的另一行;你想把所有东西组合在一起那么分母应该是什么 - 1460或1464?

现在,1460和1464是闰年和非闰年的六小时时段。我怀疑你不想除以1464或1460(如果你想要将结果按年分解 - 如果你这样做,那么查询{{1}在} a.year中很好,但你说的不是你想要的。)相反,为了计算正确的平均值,你必须在表中的非跳跃和闰年使用SUM 1460和1464。所以,分母不应该是你放在那里的;相反,它应该是

group by

所以完整的表达式应该是

sum(case when mod(to_number(a.year), 4) = 0 then 1464 else 1460 end)

通过此次更改,您无需在sum(cnt) / sum(case when mod(to_number(a.year), 4) = 0 then 1464 else 1460 end) 中加入a.year,因为您实际上是在汇总所有年份(尽管通过复杂的公式)。

这假定您的基础数据是整年。如果您的数据仅在2001年3月23日开始,该怎么办?在这种情况下,从基表计算group by的天数,然后乘以4得到6小时的周期数会好得多。如果数据从3月23日上午9点开始,这将更好;那么你将有分数周期。

还有两个注释:并非所有可被4整除的年份都是闰年。你可能没事,但只有幸运,因为2000年实际上是闰年,你的数据可能不会回到1900年或者转发到2100年,但是考虑到这一点可能(或可能不是)很重要。并且,您不应该使用保留的Oracle单词(如max(row_date) - min(row_date))作为对象名称或别名。使用year或其他类似名称。

祝你好运!

答案 1 :(得分:0)

我认为这样可行:

$(document).ready(function(){
    $("#container").load("my_data.php");
});

更改总和以包含select a.provincia_desc, a.VOLTAGE_LEVEL, sum(cnt / decode(mod(to_number(a.year),4),0,1464,1460)) avg --case --when mod(to_number(a.year),4)=0 then sum(cnt)/1464 --else sum(cnt)/1460 --end avg from (select year ....)a group by a.provincia_desc,a.VOLTAGE_LEVEL--, a.year order by avg desc

答案 2 :(得分:0)

我认为您需要进行两次聚合才能获得准确的结果:

System.Runtime