查询得到两个不同查询结果的差值
Query to get the difference value of two different queries results
我正在尝试使用 oracle 查询获取以下两个查询的差值,但我没有得到解决它的线索。
我在 table "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
您可以使用单个查询来获取所需的所有 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
不知道你为什么不使用单一查询,但无论如何
你可以像
那样做
select sum(a.column1) - sum(a.column2) as difference
from table1 a
where a.name = 'who' and a.id = '123'
group by serialno, lastname
直接查询:
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
在您的示例中,如所有响应者所示,您不需要单独的查询,您可以一次性完成。
但假设您想要某些过滤条件(例如 where a.id = '123'
)的 column1 总和与其他过滤条件(例如 where a.id = '456'
)之间的差值。然后您可以像以前一样在两个独立的查询中分别计算总和。然后将它们用作更高级别查询中的子查询。子查询应该 return 正好是一行和一列(正如您的查询所做的那样),并且它们必须被括号括起来。像这样:
select (select sum(column1) from table1 where id = '123) -
(select sum(col1) from table1 where id = '456') from dual;
(通常你不会 select 来自 dual - 这个表达式,没有 "select" 和 "from dual",可以在你通常有数字的任何地方使用。)
注意:此图仅用于说明如何在可以使用数字的地方使用 "scalar subqueries"。 (或者,根据数据类型:return 日期或字符串的标量子查询可以在任何可以使用日期或字符串的地方使用)。我给出的示例是从同一个 table 中提取总和,效率低下,使用 case 表达式可以做得更好。如果总和来自两个不同的 table,就不会有这样的 "more efficient" 解决方案。在下面的评论中查看与 Boneist 的讨论。
我正在尝试使用 oracle 查询获取以下两个查询的差值,但我没有得到解决它的线索。
我在 table "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
您可以使用单个查询来获取所需的所有 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
不知道你为什么不使用单一查询,但无论如何
你可以像
那样做select sum(a.column1) - sum(a.column2) as difference
from table1 a
where a.name = 'who' and a.id = '123'
group by serialno, lastname
直接查询:
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
在您的示例中,如所有响应者所示,您不需要单独的查询,您可以一次性完成。
但假设您想要某些过滤条件(例如 where a.id = '123'
)的 column1 总和与其他过滤条件(例如 where a.id = '456'
)之间的差值。然后您可以像以前一样在两个独立的查询中分别计算总和。然后将它们用作更高级别查询中的子查询。子查询应该 return 正好是一行和一列(正如您的查询所做的那样),并且它们必须被括号括起来。像这样:
select (select sum(column1) from table1 where id = '123) -
(select sum(col1) from table1 where id = '456') from dual;
(通常你不会 select 来自 dual - 这个表达式,没有 "select" 和 "from dual",可以在你通常有数字的任何地方使用。)
注意:此图仅用于说明如何在可以使用数字的地方使用 "scalar subqueries"。 (或者,根据数据类型:return 日期或字符串的标量子查询可以在任何可以使用日期或字符串的地方使用)。我给出的示例是从同一个 table 中提取总和,效率低下,使用 case 表达式可以做得更好。如果总和来自两个不同的 table,就不会有这样的 "more efficient" 解决方案。在下面的评论中查看与 Boneist 的讨论。