2009-10-22 29 views
25

Tôi có một bảng trông giống như sau:SQL Server: SUM() của nhiều hàng bao gồm nơi khoản

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 

Sẽ có nhiều mục hóa đơn đến một bất động sản, cũng tính tiền nhiều lần. Ví dụ RENT có thể được lập hóa đơn cho tài sản # 1 12 lần (hơn một năm), tuy nhiên những người duy nhất tôi quan tâm là những người có ENDDATE của null (trong otherwords, current)

Tôi muốn đạt được:

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

tôi đã cố gắng để làm một cái gì đó như thế này:

SELECT 
    propertyId, 
    SUM() as TOTAL_COSTS 
FROM 
    MyTable 

Tuy nhiên, trong SUM tôi sẽ buộc phải có nhiều Selects mang lại số tiền hiện tại đối với từng loại phí? Tôi có thể thấy điều này trở nên lộn xộn và tôi hy vọng cho một giải pháp đơn giản hơn nhiều

Bất kỳ ý tưởng nào?

Trả lời

43

này sẽ mang lại tổng số trên mỗi thuộc tính và gõ

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

Điều này sẽ chỉ mang lại giá trị hoạt động

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

và điều này sẽ mang lại tổng số đối với tài sản

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

......

+0

cảm ơn! Tôi đã đi cho một thứ 3, thêm một số tham gia thêm vào các bảng khác, và hey mau nó tất cả các công trình! ;) – Jimmy

8

Hãy thử điều này:

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

Bạn quên Số tiền bên trong SUM(). –

+0

@Peter: Doh! cảm ơn bạn. Đó là những gì bạn nhận được để đổ xô ... – gbn

5

bạn có nghĩa là getiing sum (Số tiền của tất cả các loại) cho mỗi tài sản nơi EndDate là null:

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

vẻ như bạn muốn một cái gì đó như:

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

Mệnh WHERE luôn là khái niệm áp dụng (kế hoạch thực hiện có thể làm những gì nó muốn, rõ ràng) trước khi GROUP BY. Nó phải đến trước GROUP BY trong truy vấn và hoạt động như một bộ lọc trước mọi thứ là SUM med, đó là cách hầu hết các câu trả lời ở đây hoạt động.

Bạn cũng nên biết điều khoản HAVING tùy chọn phải đến sauGROUP BY. Điều này có thể được sử dụng để lọc trên các thuộc tính kết quả của các nhóm sau GROUP ing - ví dụ HAVING SUM(Amount) > 0

2

Sử dụng một biểu thức bảng chung để thêm lớn tổng hàng, top 100 là cần thiết cho order by để làm việc.

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 
Các vấn đề liên quan