2017-12-01 67 views
8

मैं एक मेज है:क्या समूह को, होने और Sum को जोड़ना संभव है?

------------------------ 
|id|p_id|desired|earned| 
------------------------ 
|1 | 1 | 5 | 7 | 
|2 | 1 | 15 | 0 | 
|3 | 1 | 10 | 0 | 
|4 | 2 | 2 | 3 | 
|5 | 2 | 2 | 3 | 
|6 | 2 | 2 | 3 | 
------------------------ 

मैं कुछ गणना करने, और एक वास्तव में जटिल नहीं अनुरोध में इसे बनाने के लिए प्रयास करने की आवश्यकता है, अन्यथा मुझे पता है कि अनुरोधों की संख्या के साथ यह गणना करने के लिए। निम्नलिखित की तरह मैं परिणामस्वरूप जरूरत तालिका:

--------------------------------------------------------- 
|p_id|total_earned| AVG |  Count  | SUM | 
| |   | (desired)|(if earned != 0)|(desired)| 
--------------------------------------------------------- 
| 1 |  7  |  10 |  1  | 30 | 
| 2 |  9  |  2 |  3  | 6 | 
--------------------------------------------------------- 

मैं अब तक का निर्माण:

SELECT p_id, SUM(earned), AVG(desired), Sum(desired) 
FROM table GROUP BY p_id 

लेकिन मैं समझ नहीं कैसे शर्तों के साथ वर्गीकृत किया अभिलेखों की संख्या की गणना करने के। मैं इस नंबर को HAVING के साथ प्राप्त कर सकता हूं लेकिन अलग-अलग अनुरोध में।

मुझे लगभग यकीन है कि एसक्यूएल में यह शक्ति क्या होनी चाहिए।

+0

मैं Postgres का उपयोग करें, लेकिन मैं सार्वभौमिक समाधान के लिए खोज। –

उत्तर

12

आप इसके लिए CASE अभिव्यक्ति का उपयोग कर सकते हैं।

इस प्रयास करें,

SELECT p_id 
    ,SUM(earned) AS total_earned 
    ,AVG(desired) AS avg_desired 
    ,COUNT(CASE WHEN Earned!=0 THEN 1 END) AS earned_count 
    ,SUM(desired) AS sum_desired 
FROM table 
GROUP BY p_id; 
3

आप लगभग आपकी क्वेरी सिर्फ अर्जित गिनती

SELECT 
      p_id, 
      SUM(earned) [total_earned], 
      AVG(desired) [desired], 
      SUM(CASE WHEN earned <> 0 THEN 1 ELSE 0 END) [COUNT], 
      SUM(desired) [SUM] FROM <table> 
GROUP BY p_id 

परिणाम

p_id total_earned desired COUNT SUM 
1  7    10  1  30 
2  9    2   3  6 
+0

यह गैर-मानक SQL –

+0

पोस्टग्रेज़ (या मानक SQL) के लिए अमान्य वाक्यविन्यास है। –

3

एक छोटा विकल्प के लिए case अभिव्यक्ति की मदद से सशर्त एकत्रीकरण जोड़ने किया है CASE पर

है
SELECT p_id, 
    SUM(earned) AS total_earned, 
    AVG(desired) AS average_desired, 
    COUNT(earned != 0 OR NULL) AS earned_count, 
    SUM(desired) AS sum_desired 
FROM table GROUP BY p_id; 

क्योंकि NULL एस की गणना नहीं की जाती है।

SELECT p_id 
    , count(NULLIF(earned, 0)) AS earned_count 
    -- , more ... 
FROM table 
GROUP BY 1; 

count() केवल गैर-शून्य मान मायने रखता है:

संबंधित मुद्दे