2009-10-22 9 views
25

Mam tabelę, która wygląda mniej więcej tak:SQL Server: SUM() z wielu wierszy w tym w przypadku klauzul

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 

nie będzie wiele elementów rozliczane do nieruchomości, również rozliczane wielokrotnie. Na przykład WYNAJMUJ można zapłacić 12 razy na własność # 1 (ponad rok), ale jedyne, co mnie interesuje, to te z ENDDATE o wartości zerowej (w innych słowach, aktualne)

Chciałbym osiągnąć:

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

próbowałem zrobić coś takiego:

SELECT 
    propertyId, 
    SUM() as TOTAL_COSTS 
FROM 
    MyTable 

jednak w SUM będę zmuszona do wielu wybiera przywracając aktualną kwotę dla każdego rodzaju opłat? Widzę, że to staje się brudne i mam nadzieję na znacznie prostsze rozwiązanie. Czy masz jakieś pomysły?

Odpowiedz

43

To przywróci sumy na nieruchomości i wpisz

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

Powoduje przywrócenie tylko aktywnych wartości

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

a to przyniesie z powrotem do podsumowania właściwości

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

......

+0

dzięki! Poszedłem na trzeci, dodałem dodatkowe sprzężenia do innych stołów i hej, że wszystko działa! ;) – Jimmy

8

Spróbuj tego:

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

Zapomniałeś ilości wewnątrz SUMY(). –

+0

@Peter: Doh! Dziękuję Ci. To właśnie dostajesz za pośpiech ... – gbn

5

masz na myśli getiing sumę (ilość wszystkich typów) dla każdej nieruchomości, gdzie DataZakończenia jest zerowy:

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

brzmi jak chcesz coś takiego:

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

Klauzula WHERE zawsze jest koncepcyjnie zastosowane (plan wykonania może oczywiście zrobić to, co chce, oczywiście) przed GROUP BY. Musi nadejść przed zapytaniem GROUP BY i działa jako filtr przed rzeczami, które są SUM med, w ten sposób większość odpowiedzi tutaj działa.

Należy również zdawać sobie sprawę z opcjonalnym HAVING klauzuli których muszą pochodzić poGROUP BY. Może to być wykorzystywane do filtrowania uzyskanych właściwości grupy po GROUP ing - na przykład HAVING SUM(Amount) > 0

2

użytkowania wspólną ekspresję tabeli dodać sumy całkowitej wiersz top 100 wymagana jest order by do pracy.

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 
Powiązane problemy