2012-10-08 39 views
6

यह एक बहुत ही बुनियादी समस्या है और किसी भी कारण से मुझे उचित समाधान नहीं मिल रहा है। मैं समझाने के लिए अपनी पूरी कोशिश करूंगा।पोस्टग्रेस्क्ल में विशिष्ट और फिर एक समग्र फ़ंक्शन का उपयोग करना?

कहें कि आपके पास एक ईवेंट टिकट (अनुभाग, पंक्ति, सीट #) है। प्रत्येक टिकट एक उपस्थिति से संबंधित है। एकाधिक टिकट एक ही उपस्थिति से संबंधित हो सकते हैं। प्रत्येक उपस्थिति के पास एक लायक होता है (उदा: उपस्थिति # 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. प्रत्येक टिकट में $ 5,000 की उपस्थिति होती है। इसलिए यदि टिकट अलग-अलग वर्गों में हैं, तो वे उनके साथ अपना मूल्यवान मूल्य लेते हैं।

आपकी मदद के लिए धन्यवाद।

+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 टिकट का उपयोग कर रहा है। प्रत्येक टिकट मूल्य के लिए $ 5,000 योगदान देता है। इसलिए यदि प्रत्येक टिकट एक अलग सेक्शन में था, तो यह अपने संबंधित अनुभाग में $ 5,000 जोड़ देगा। क्या इसका कोई मतलब है? –

+0

क्या इससे कोई त्रुटि उत्पन्न नहीं होती है? व्युत्पन्न तालिका ("टा") ठीक से समूह नहीं है। मुझे यकीन है कि PostgreSQL इसे अस्वीकार कर देगा। –

+0

@a_horse_with_no_name। । । हां, मैंने अपने इरादे से मेल खाने के लिए कोड तय किया। –