你好!无论如何要在不使用联合的情况下编写类似的查询吗?
Posted
技术标签:
【中文标题】你好!无论如何要在不使用联合的情况下编写类似的查询吗?【英文标题】:Hello! is that anyway to write similar query without using union? 【发布时间】:2020-09-22 13:43:29 【问题描述】:难道不使用联合也可以编写类似的查询吗?
select sum(decode(p.sumsend,0,1,0)) recvcnt,
sum(decode(p.sumsend,0,1,0)*p.sumserv) recvsum
from some_table p
where p.polefilter = 5
union
select sum(decode(p.sumsend,0,1,0)) recvcnt,
sum(decode(p.sumsend,0,1,0)*p.sumserv) recvsum
from some_table p
where p.polefilter != 5
【问题讨论】:
【参考方案1】:如果您可以将所有 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(并且在某种程度上更灵活)。
【讨论】:
【参考方案2】:像下面这样的查询应该可以工作。下次提问时请提供示例数据和预期输出。
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;
【讨论】:
以上是关于你好!无论如何要在不使用联合的情况下编写类似的查询吗?的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用已弃用的类的情况下编写 Hadoop map reduce 作业?
如何在不单独编写的情况下编写具有多个字符[,>等的字符串[重复]