【问题标题】: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

【问题讨论】:

    标签: sql oracle sum pivot query-optimization


    【解决方案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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-06
        • 2022-01-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多