2016-05-12 177 views
-2

我想使用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 
+1

爲什麼這些ORDER BY子句? Oracle是否提出錯誤? – jarlh

+1

'sum(column1) - sum(column2)'不工作嗎? – Aleksej

+0

其求和(columm1) - 求和(column2)。謝謝 – sangeetha

回答

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

您可以使用單個查詢來獲取所有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 
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 
1

在您的例子,如圖所示,所有應答,你並不需要單獨的查詢,你可以一口氣做到這一切。

但是,假設您想要某個過濾條件(例如where a.id = '123')的column1總和與其他過濾條件(例如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的討論。

+0

你不需要兩個單獨的子查詢;你可以在使用case表達式的單個查詢中做同樣的事情,例如。'select sum(case id ='123'then column1 end) - sum(case id ='456'then column2 end)from table1 where id in('123','456');' – Boneist

+0

好吧,我猜對了有人會提出這樣的建議,但並不想讓這個概念更加複雜。如果總和位於不同表中的列上,則不能使用大小寫表達式。我試圖做的是關於標量子查詢以及如何使用它們。 – mathguy

+0

你可能想編輯你的答案,然後明確。如果柱子來自不同的桌子,那是完全不同的水壺。通過向OP(它的列來自單個表格)提出這個建議,你會鼓勵潛在的更糟糕的表現(兩次掃描通過表格,而不是一次)。 – Boneist