首页 > 解决方案 > 我的查询正确吗?我可以优化它吗?整数的正和和负和

问题描述

我有两种解决方案来求正整数和负整数之和。请告诉哪个更正确和更优化?或者还有其他更优化和正确的查询吗?问:

考虑具有 col1 及以下值的表 A。

col1

20
-20
40
-40
-30
30

我需要以下输出

POSITIVE_SUM    NEGATIVE_SUM

90               -90

我有两个解决方案。

/ q1 /

  select POSITIVE_SUM,NEGATIVE_SUM from
     (select distinct sum(a2.col1) AS "POSITIVE_SUM" from A a1 join A a2 on a2.col1>0 
     group by a1.col1)
     t1

 ,
 (select distinct sum(a2.col1) AS "NEGATIVE_SUM"from A a1 join A a2 on a2.col1<0 
 group by a1.col1) t2;

/ q2 /

select sum (case when a1.col1 >= 0 then a1.col1 else 0 end) as positive_sum,
       sum (case when a1.col1 < 0 then  a1.col1 else 0 end) as negative_sum
from A a1;


    POSITIVE_SUM    NEGATIVE_SUM

    90                  -90


标签: sqlsql-server

解决方案


我想知道你是如何想出第一个解决方案的:
- 自连接(两次)表,
- 产生6(相同的)行,最后distinct得到 1 行,
- 然后交叉连接 2 个结果。
我准备了一个演示,以便您可以看到导致您的第一个解决方案结果的步骤。
我不知道这是否可以以任何方式进行优化,
但是是否有可能像您的第二个解决方案一样使用条件聚合击败表的单次扫描?
我不这么认为。


推荐阅读