hive在使用case语句和聚合时按列分组出错

vx6bjr1n  于 2021-06-01  发布在  Hadoop
关注(0)|答案(1)|浏览(345)

我正在hive中处理一个查询。因为我使用了sum和case语句以及groupby子句等聚合。我已经更改了列名和表名,但是我的逻辑与我在项目中使用的相同

select 
empname,
empsal, 
emphike,
sum(empsal) as tot_sal,
sum(emphike) as tot_hike,
case when tot_sal > 1000 then exp(tot_hike)
else 0
end as manager
from employee
group by 
empname,
empsal,
emphike

对于上面的查询,我得到的错误是“expression not in group by key‘1000’”。所以我稍微修改了这个查询,然后再次尝试我的另一个查询是

select 
empname,
empsal, 
emphike,
sum(empsal) as tot_sal,
sum(emphike) as tot_hike,
case when sum(empsal) > 1000 then exp(sum(emphike))
else 0
end as manager
from employee
group by 
empname,
empsal,
emphike

对于上面的查询,其puting me错误为“expression not in group by key‘manager’”。当我在组中添加管理器时,其显示的别名无效。请帮帮我

5q4ezhmt

5q4ezhmt1#

我在你的询问中看到三个问题:
1.)配置单元不能按您在select块中定义的变量按您立即指定的名称进行分组。您可能需要一个子查询。
2.)当 sum 或者 count 操作不在查询的末尾。
3.)虽然我不知道您的目标是什么,但我认为您的查询不会产生预期的结果。如果你分组 empsal 两者之间没有区别 empsal 以及 sum(empsal) 设计的。同样的道理 emphike 以及 sum(emphike) .
我认为以下查询可能会解决这些问题:

select
a.empname,
a.tot_sal, 
a.tot_hike,
if(a.tot_sal > 1000, exp(a.tot_hike), 0) as manager
from
(select 
empname,
sum(empsal) as tot_sal,
sum(emphike) as tot_hike,
from employee
group by 
empname
)a

这个 if 声明等同于您的 case 然而,我发现它更容易阅读。
在本例中,您不需要在子查询之后按分组,因为分组是在子查询中完成的 a .

相关问题