2013-07-25 67 views
1

我正在嘗試使用Oracle的數據庫。 我試圖從同一行中總結兩列並輸出總計。 但是,我似乎無法得到它的工作。這是我迄今爲止的代碼。使用子查詢求和多列

SELECT a.name , SUM(b.sequence + b.length) as total 
FROM (
    SELECT a.name, a.sequence, b.length 
    FROM tbl1 a, tbl2 b 
    WHERE b.sequence = a.sequence 
    AND a.loc <> -1 
    AND a.id='10201' 
    ORDER BY a.location 
) 

內部查詢工作,但我似乎無法使新的查詢和子查詢一起工作。

下面是我使用的一個示例表:

...[name][sequence][length]... 
...['aa']['100000']['2000']... 
      ... 
...['za']['200000']['3001']... 

而這裏的輸出我想:

[name][ total ] 
['aa']['102000'] 
      ... 
['za']['203001'] 

幫助非常感謝,謝謝!

回答

0

SUM()跨行數的總和號碼。取而代之的是sequence + length

...或者如果在sequencelength列中可能出現NULL值,請使用:COALESCE(sequence, 0) + COALESCE(length, 0)。或者,如果您的意圖的確是要產生一個運行總數(即彙總每個用戶的所有總數和長度的總和),則在子查詢結束後添加一個GROUP BY a.name

順便說一句:你不應該引用子查詢之外的子查詢中使用的內部別名。一些數據庫服務器允許它(現在我沒有方便的訪問Oracle服務器,所以我可以測試它),但這不是一個好習慣。

我覺得你以後有什麼是一樣的東西:

SELECT a.name, 
     SUM(B.sequence + B.length) AS total 
FROM Tbl1 A 
     INNER JOIN Tbl2 B 
     ON B.sequence = A.sequence 
WHERE A.loc <> -1 
    AND A.id = 10201 
     GROUP BY a.name 
     ORDER BY A.location 
+0

嗨,我確實需要跑步總數。我試過GROUP BY a.name,但它說a.name是一個無效的標識符。即使沒有它,序列+長度也會失敗。 – bigbitecode

+0

這是因爲您正在引用子查詢中的內部別名。我已經添加了一個我認爲可以解決我問題的查詢... – Curt

+0

謝謝。是的,這正是我期待的。子查詢不是必需的。謝謝柯特! – bigbitecode

0

您與子查詢的查詢有以下幾個原因失敗:

  • 您使用表的別名a,但它沒有定義。
  • 您使用表別名b,但它沒有定義。
  • 您在select子句中有sum()子句,但列沒有聚集,但沒有group by

另外,在子查詢中有一個order by,它在語法上是允許的,但被忽略。

下面是編寫查詢,而不子查詢一種更好的方式:

SELECT t1.name, (t1.sequence + t2.length) as total 
FROM tbl1 t1 join 
    tbl2 t2 
    on t1.sequence = t2.sequence 
where t1.loc <> -1 AND t1.id = '10201' 
ORDER BY t1.location; 

注意使用正確的join語法,使用別名有意義的,並且在這個級別的簡單計算。

這裏是一個子查詢版本:

select name, (sequence + length) as total 
from (SELECT t1.name, t1.sequence, t2.length 
     FROM tbl1 t1 join 
      tbl2 t2 
      on t1.sequence = t2.sequence 
     where t1.loc <> -1 AND t1.id = '10201' 
    ) t 
ORDER BY location; 

注意,order by在外部層面去。而且,我給了子查詢一個別名。這不是嚴格要求,但通常是一個好主意。