2011-11-01 33 views
1

非常簡化,我有一列數字和一列日期。我想生成一行,將基於一個日期的數字合併到一列中,將另一個日期合併到另一列中。取一列並在一行上生成兩個總數

的數據看起來是這樣的 -

date  number 
201111 500 
201111 500 
201111 500 
201109 500 

我想它看起來就像這樣 -

sum1 sum 2 
1500  500 

的代碼我使用:

SELECT SUM(A1.COL1),SUM(A2.COL1) 
FROM TAB1 A1,TAB1 A2 
WHERE A1.DATE = '201111' 
AND A2.DATE = '201109' 

的結果表明,我得到的是 -

sum1 sum2 
1000 1500 

基本上,它不是sum1的所有sum1(應該是1500但是返回1000)並且它總和sum2太多(應該是500但是返回1500)。

+0

如果使用PIVOT過你確定你的查詢是從一個角度加盟想要什麼?你的查詢將把Tab1中的每一行與它自己關聯起來(Tab1中的100行將產生100×100行將被加總)。 – Thomas

+0

首先擺脫隱含的語法。你現在有一個交叉連接。沒有理由永遠使用隱式語法,因爲您的問題已經顯示,應該避免它,因爲它會導致錯誤。請不要再使用這種可憐的語法。學習使用顯式連接。 – HLGEM

+0

你的oracle版本是什麼? – Chains

回答

8

你可能要像

SELECT SUM(case when date = '201111' then col1 else null end) sum1, 
     SUM(case when date = '201109' then col1 else null end) sum2 
    FROM tab1 
WHERE date in ('201109', '201111') 

當然,你真的應該考慮存儲日期在DATE列,而不是VARCHAR2列。

+0

謝謝,我做了這樣的事情,它工作得很好。不幸的是,在我閱讀你的文章之前,我已經想清楚了。此外,只是供參考,日期不是真實的日期,但代碼的時間長於一個月但短於一年。 – user1024426

2

您可以在11g

SELECT * 
FROM (SELECT date, sum(number) number 
    FROM Tab1 
    GROUP BY date) 
    PIVOT (sum(number) FOR date IN ('201109', '201111')); 
相關問題