我正在处理此查询,但我有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
答案 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