你好!无论如何要在不使用联合的情况下编写类似的查询吗?

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 作业?

如何在不单独编写的情况下编写具有多个字符[,>等的字符串[重复]

如何在不使用flutter_test.dart包的情况下编写用于在flutter集成测试中点击屏幕点的测试脚本?

如何在不重复自己的情况下编写三元运算符(又名 if)表达式

如何在不创建新输入信号的情况下编写具有多个输入的多路复用器?