2009-10-22 12 views
25

मैं एक मेज है जो निम्न तरह दिखता है:एसक्यूएल सर्वर: जहां खंड सहित कई पंक्तियों की SUM()

PropertyID  Amount  Type  EndDate 
-------------------------------------------- 
    1    100  RENT  null    
    1    50  WATER  null   
    1    60  ELEC  null   
    1    10  OTHER  null  
    2    70  RENT  null 
    2    10  WATER  null 

कई एक संपत्ति के लिए बिल भेजा आइटम, भी कई बार बिल भेजा होगा। उदाहरण के लिए आरईएनटी को संपत्ति # 1 12 गुना (एक वर्ष से अधिक) के लिए बिल किया जा सकता है, हालांकि केवल उन्हीं के लिए दिलचस्पी रखने वाले लोग हैं जो नल के अंत में हैं (अन्य शब्दों में, वर्तमान)

मैं प्राप्त करना चाहता हूं:

PropertyId  Amount 
    --------------------------  
     1    220 
     2    80 

मैं इस तरह से कुछ करने की कोशिश की है:

SELECT 
    propertyId, 
    SUM() as TOTAL_COSTS 
FROM 
    MyTable 

हालांकि, कुल मिलाकर मैं प्रभार से प्रत्येक प्रकार के लिए वर्तमान राशि को वापस लाने के लिए कई चयन करने के लिए मजबूर किया जाएगा? मैं यह गन्दा हो रहा था और मैं एक बहुत ही सरल समाधान की उम्मीद कर रहा हूं

कोई विचार? जहां EndDate रिक्त है प्रत्येक प्रॉपर्टी के लिए आप योग getiing मतलब

SELECT 
    PropertyId, 
    SUM(Amount) as TOTAL_COSTS 
FROM 
    MyTable 
WHERE 
    EndDate IS NULL 
GROUP BY 
    PropertyId 

उत्तर

43

यह गुण प्रति योग वापस लाना होगा और प्रकार

SELECT PropertyID, 
     TYPE, 
     SUM(Amount) 
FROM yourTable 
GROUP BY PropertyID, 
      TYPE 

यह केवल सक्रिय मान वापस लाएगा

SELECT PropertyID, 
     TYPE, 
     SUM(Amount) 
FROM yourTable 
WHERE EndDate IS NULL 
GROUP BY PropertyID, 
      TYPE 

और इस गुण

SELECT PropertyID, 
     SUM(Amount) 
FROM yourTable 
WHERE EndDate IS NULL 
GROUP BY PropertyID 

के लिए योग वापस लाना होगा ......

+0

धन्यवाद! मैं तीसरे के लिए गया, कुछ अतिरिक्त जोड़ों को अन्य तालिकाओं में जोड़ा, और हे सब कुछ काम करता है! ;) – Jimmy

8

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

SELECT propertyId, SUM(Amount) as TOTAL_COSTS 
    FROM MyTable 
WHERE EndDate IS NULL 
GROUP BY propertyId 
+1

आप SUM() के अंदर राशि भूल गए हैं। –

+0

@ पीटर: दोह! धन्यवाद। दौड़ने के लिए आपको यही मिलता है ... – gbn

4

लगता है कि आप की तरह कुछ हैं:

select PropertyID, SUM(Amount) 
from MyTable 
Where EndDate is null 
Group by PropertyID 
2

WHERE खंड हमेशा धारणात्मक है GROUP BY से पहले लागू (निष्पादन योजना जो चाहती है वह कर सकती है) जाहिर है। यह क्वेरी में GROUP BY से पहले आना चाहिए, और फ़िल्टर से पहले SUM मेड से पहले फ़िल्टर के रूप में कार्य करता है, जो कि यहां के अधिकांश उत्तर यहां काम करते हैं।

आपको वैकल्पिक HAVING खंड से अवगत होना चाहिए जो GROUP BY के बाद आना चाहिए। यह GROUP ing के बाद समूहों में से जिसके परिणामस्वरूप गुणों पर फिल्टर करने के लिए इस्तेमाल किया जा सकता - महायोग पंक्ति जोड़ने के लिए एक आम तालिका अभिव्यक्ति उदाहरण HAVING SUM(Amount) > 0

2

उपयोग के लिए, top 100order by काम करने के लिए आवश्यक है।

With Detail as 
(
    SELECT top 100 propertyId, SUM(Amount) as TOTAL_COSTS 
    FROM MyTable 
    WHERE EndDate IS NULL 
    GROUP BY propertyId 
    ORDER BY TOTAL_COSTS desc 
) 

Select * from Detail 
Union all 
Select ' Total ', sum(TOTAL_COSTS) from Detail 
संबंधित मुद्दे