查询以获取两个不同查询结果的差值

时间:2016-05-12 13:03:48

标签: sql oracle plsqldeveloper

我正在尝试使用oracle查询获得以下两个查询的差值,但我没有得到解决它的线索。

我在表“table1”中有两个不同的列“column1”和“column2”。

首先我想要column1值的总和,然后我想要column2值的总和 - 我得到了这个的查询

第三,我想要上述两个结果的区别 - 任何人都可以帮忙解决这个问题吗?

查询1:

select sum(a.column1) as sum1
from table1 a
where a.name = 'who' and a.id = '123'
group by serialno, lastname

查询2:

select sum(a.column2) as sum2
from table1 a
where a.name = 'who' and a.id = '123'
group by serialno, lastname

4 个答案:

答案 0 :(得分:2)

您可以使用单个查询来获取所需的所有3个结果::

select sum(column1),
       sum(column2),
       sum(column1) - sum(column2) as diff,
       serialno,
       lastname
from table1 a
where a.name = 'who' and a.id = '123'
group by serialno, lastname

答案 1 :(得分:1)

直接查询:

select 
  sum(a.column1) as sum1, 
  sum(a.column2) as sum2, 
  sum(a.column2) - sum(a.column1) as diff  
from table1 a;

示例:

SQL> insert into table1 values (1,10);

1 row created.

SQL> insert into table1 values (2,20);

1 row created.

SQL> select sum(a.column1) as sum1, sum(a.column2) as sum2, sum(a.column2)-sum(a.column1) as diff  from table1 a;

      SUM1       SUM2       DIFF
---------- ---------- ----------
         3         30         27

答案 2 :(得分:1)

在您的示例中,如所有响应者所示,您不需要单独查询,您可以一次性完成所有操作。

但是假设您想要某些过滤条件的column1之和(例如where a.id = '123')和其他过滤条件(例如where a.id = '456')之间的差异。然后,您可以像在两个独立查询中一样单独计算总和。然后在较高级别的查询中将它们用作子查询。子查询应该只返回一行和一列(如查询所做的那样),并且它们必须用圆括号括起来。像这样:

select (select sum(column1) from table1 where id = '123) - 
                          (select sum(col1) from table1 where id = '456') from dual;

(通常你不能从双重选择 - 这个表达式,没有"选择"和"来自双",可以在你通常拥有数字的任何地方使用。)

注意:此图仅用于说明"标量子查询"可以在任何可以使用数字的地方使用。 (或者,根据数据类型:返回日期或字符串的标量子查询可以在可以使用日期或字符串的任何地方使用)。我给出的示例,从同一个表中提取总和,效率很低,可以使用case表达式更好地完成。如果总和来自两个不同的表,那么就没有这样的"更高效的"解。请参阅以下评论中与Boneist的讨论。

答案 3 :(得分:0)

不知道你为什么不使用单一查询,但无论如何

你可以像

那样做
select sum(a.column1) - sum(a.column2) as difference
from table1 a
where a.name = 'who' and a.id = '123'
group by serialno, lastname