2012-10-08 57 views
6

這是一個非常基本的問題,無論出於何種原因我找不到合理的解決方案。我會盡力解釋。在Postgresql中使用distinct和aggregate函數?

假設您有活動門票(部分,行,座位#)。每張票都屬於與會者。多張門票可以屬於同一個參加者。每位參加者都有價值(例如:參加者#1價值10,000美元)。這就是說,這裏就是我想要做的:

1. Group the tickets by their section 
2. Get number of tickets (count) 
3. Get total worth of the attendees in that section 

這裏就是我遇到的問題:如果與會者#1是價值$ 10,000,用4張,合計(attendees.worth)將返回$ 40,000。這是不準確的。價值應該是10,000美元。然而,當我在與會者中取得不同的結果時,計數​​並不準確。在一個理想的世界裏,很高興做類似

select 
    tickets.section, 
    count(tickets.*) as count, 
    sum(DISTINCT ON (attendees.id) attendees.worth) as total_worth 
from 
    tickets 
    INNER JOIN 
    attendees ON attendees.id = tickets.attendee_id 
GROUP BY tickets.section 

顯然這個查詢不起作用。我怎樣才能在單個查詢中完成同樣的事情?或者它甚至有可能?我寧願遠離子查詢,因爲這是一個更大的解決方案的一部分,我需要在多個表中執行此操作。

此外,價值應該遵循均勻劃分的票。例如:10,000美元/ 4.每張門票的參與者價值5000美元。所以如果門票分屬不同的部分,他們會按比例分配他們的價值。

感謝您的幫助。

+0

我知道這是一段時間,但我有完全相同的問題的類型,我想知道你是否能夠解決它。 – denaje

回答

2

您需要的與會者前聚集門票:

select ta.section, sum(ta.numtickets) as count, sum(a.worth) as total_worth 
from (select attendee_id, section, count(*) as numtickets 
     from tickets 
     group by attendee_id, section 
    ) ta INNER JOIN 
    attendees a 
    ON a.id = ta.attendee_id 
GROUP BY ta.section 

你仍然具有其值在多個部分席位單與會者的問題。然而,你不指定如何解決(分配價值?隨機選擇一個部分?將它歸因於所有部分?正常選擇一個部分?)

+0

感謝您的支持,但是這不算數值多次嗎?價值取決於票數。例如:參加者#1價值10,000美元,使用4張門票。每張門票的價值爲5000美元。因此,如果每張票都在不同的部分,那麼它會爲其各自的部分增加5,000美元。那有意義嗎? –

+0

這不會產生錯誤嗎?派生表(「ta」)沒有正確分組。我很確定PostgreSQL會拒絕這個。 –

+0

@a_horse_with_no_name。 。 。是的,我修復了代碼以符合我的意圖。 –

相關問題