如何解决你好!反正不使用工会写类似的查询?
那是在不使用工会的情况下写类似的查询吗?
select sum(decode(p.sumsend,1,0)) recvcnt,sum(decode(p.sumsend,0)*p.sumserv) recvsum
from some_table p
where p.polefilter = 5
union
select sum(decode(p.sumsend,0)*p.sumserv) recvsum
from some_table p
where p.polefilter != 5
解决方法
如果可以将所有4列都放在一行上,那么一种选择是条件聚合:
select
sum(case when polefilter = 5 and sumsend = 0 then 1 else 0 end) recvcnt1,sum(case when polefilter = 5 and sumsend = 0 then 1 else 0 end * sumserv) recvsum1,sum(case when polefilter <> 5 and sumsend = 0 then 1 else 0 end) recvcnt2,sum(case when polefilter <> 5 and sumsend = 0 then 1 else 0 end * sumserv) recvsum2
from some_table p
where polefilter is not null
另一方面,如果要在结果集中有两行,则可以使用聚合和case
表达式来定义组:
select
case when polefilter = 5 then 1 else 0 end as polefilter_is_5
sum(case when sumsend = 0 then 1 else 0 end) recvcnt,sum(case when sumsend = 0 then 1 else 0 end * sumserv) recvsum1
from some_table p
where p.polefilter is not null
group by case when polefilter = 5 then 1 else 0 end
请注意,我将decode()
函数更改为case
表达式;两者都做同样的事情,但是最新的是标准SQL(并且在某种程度上更灵活)。
类似以下查询的查询应该起作用。下次问问题时,请提供示例数据和预期输出。
SELECT SUM (CASE WHEN p.sumsend = 0 THEN 1 ELSE 0 END) recvcnt,SUM (CASE WHEN p.sumsend = 0 THEN 1 ELSE 0 END * p.sumserv) recvsum
FROM some_table p
GROUP BY CASE p.polefilter WHEN 5 THEN 1 ELSE 0 END;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。