2013-03-28 17 views
2

我有這樣的代碼:執行連接時可以獲得總和嗎?

select id, 
p1.value as company, 
p2.value as budget 

FROM process p 

LEFT JOIN Param p1 on p1.ID = p.ID AND p1.NAME = 'Company' 
LEFT JOIN Param p2 ON p2.ID = p.ID AND p2.NAME = 'Budget' 

where type = 'Authorization'; 

我有少數幾家公司。這裏的樣本結果是:

Company  Budget 

Goodis  10000 
McDonalds 15000 
Goodis  500 
Goodis  100 
Everest  100 
McDonalds 1000 
Everest  10000 

我想要做的是讓每家公司預算的總和(我不能單獨的公司在where子句中,因爲我需要整個數據和有噸公司)。對於我來說,在SQL中看起來很難。我正在嘗試做BIRT報告,因此,如果您有任何關於在BIRT級別上獲得它的建議,我也會非常高興!

這是一種做法,或者我的嘗試毫無意義?

回答

3

我相信你想要的解析函數:

select id, p1.value as company, p2.value as budget, 
     sum(p2.value) over (partition by p1.value) as CompanyBudget 
FROM process p 
LEFT JOIN Param p1 on p1.ID = p.ID AND p1.NAME = 'Company' 
LEFT JOIN Param p2 ON p2.ID = p.ID AND p2.NAME = 'Budget' 
where type = 'Authorization'; 

這將在返回的總預算每行,但不減少行數。

+0

它的工作!巨大感謝您的幫助! – Slim 2013-03-28 11:18:03

0

使用GROUP BY p1.valueSUM

select 
    p.value as company, 
    COALESCE(SUM(p2.value), 0) as Totalbudget 
FROM Param AS p 
LEFT JOIN process AS p1 ON p.ID = p1.ID AND p.NAME = 'Company' 
LEFT JOIN process AS p2 ON p.ID = p2.ID AND p.NAME = 'Budget' 
GROUP BY p.value; 
+0

我剛剛得到了與帖子中提到的結果相同的結果。 :( – Slim 2013-03-28 08:47:38

+0

@Slim它應該可以正常工作,你可以從兩個表'param'和'process'發佈一些示例數據,這對解釋這個問題將會非常有幫助謝謝 – 2013-03-28 08:49:17

+0

它運行不正常,我會解釋你爲什麼。:)問題是'COALESCE(SUM(p2.value),0)as Totalbudget'獲得了返回的(當前)行的SUM,所以沒有任何區別,因爲我們沒有得到與公司聯繫的所有生產線的總和。 – Slim 2013-03-28 08:57:36

0

看看這有助於 -

SELECT id, company, SUM(NVL(budget, 0)) AS budget 
FROM 
(
    SELECT id, 
    p1.value AS company, 
    p2.value AS budget 
    FROM process p 
    LEFT JOIN Param p1 on p1.ID = p.ID AND p1.NAME = 'Company' 
    LEFT JOIN Param p2 ON p2.ID = p.ID AND p2.NAME = 'Budget' 
    WHERE TYPE = 'Authorization' 
) 
WHERE company IS NOT NULL 
GROUP BY id, company 
+0

謝謝你試圖幫助我!我又得到了同樣的結果。 :( – Slim 2013-03-28 09:24:05

相關問題