2012-04-27 49 views
5

Tôi có một bảng chứa khoảng 50.000 hồ sơ thông tin đã được thiết lập để nhìn lại như xa như bắt đầu của năm tài chính hiện tại.Tổng hợp một trường cho mỗi tháng cummulatively và động

Khi đứng tôi chưa cập nhật bảng này kể từ tháng trước để hiện dữ liệu trong đó giả định chúng tôi vẫn nhìn lại như xa trở lại như ngày 01 Tháng Tư 2011.

lưu ý (khi tôi làm mới dữ liệu, sẽ có chỉ có dữ liệu tháng 4 năm 2012 trong đó cũng như bây giờ chúng tôi đang trong tháng Tư, sau đó tháng năm nó sẽ có tháng 4 năm 2012 và tháng 5 năm 2012 và vân vân ...)

Mỗi bản ghi có 4 cột tôi lo ngại với:

Department, 
Incident date, 
month, 
year, 
reduced 

Cả cột tháng và năm đều được tạo m sự cố ngày lĩnh vực mà là ở định dạng này:

2011-06-29 00:00:00.000 

tôi cần phải cho từng bộ phận, hãy tính tổng giảm nhưng trong một thời trang tích lũy.

ví dụ: xem như tháng 4 năm 2011 sẽ là dữ liệu tháng/năm sớm nhất hiện tại tôi có thể biết tổng số tiền đã giảm cho mỗi bộ phận trong tháng 4.

Sau đó cho tháng tôi muốn Tháng Tư & Có thể kết hợp, cho tháng sáu tôi cần tháng Tư, tháng Năm, tháng Sáu và vân vân ...

Có một cách thông minh để làm điều này để ngay sau khi tôi tái nhập dữ liệu vào bảng này nó sẽ nhận ra rằng bây giờ chỉ có một tháng và năm đó đã được cập nhật và ý chí cho bây giờ cho đến tháng tới chỉ hiển thị tổng tháng Tư (giảm)

+0

loại của 'Incident date' trường là gì? ngày giờ? varchar? –

+0

@Mark Byers datetime – JsonStatham

+0

@SelectDistinct có một cái nhìn ở đây: - http://stackoverflow.com/questions/2120544/how-to-get-cumulative-sum –

Trả lời

1
select t1.id, t1.singlenum, SUM(t2.singlenum) as sum 

    from @t t1 inner join @t t2 on t1.id >= t2.id 
    group by t1.id, t1.singlenum 
    order by t1.id 
1

sau đây sẽ trả lại tổng số tích lũy được phân nhóm theo Department, YearMonth . Nếu bạn xóa dữ liệu khỏi năm thuế trước đó khi làm mới thì bạn có thể bỏ qua mệnh đề WHERE.

SELECT  T1.[Year], 
      T1.[Month], 
      T1.Department, 
      SUM(T2.Reduced) ReducedTotals 
FROM  [TABLENAME] T1 
INNER JOIN [TABLENAME] T2 ON (T1.Department = T2.Department AND T1.IncidentDate >= T2.IncidentDate) 
WHERE  T1.IncidentDate >= '2012-04-01' 
GROUP BY T1.[Year], 
      T1.[Month], 
      T1.Department 
ORDER BY T1.[Year], 
      T1.[Month], 
      T1.Department 
+3

Nếu bạn đang làm việc với một số lượng lớn các bản ghi từ xa, Tôi khuyên bạn nên xem xét các câu trả lời khác được liên kết trong phần nhận xét. Đối với bất kỳ khối lượng hợp lý nào, một sản phẩm nửa cartessian như thế này có thể rất chậm, nhiều đến nỗi ngay cả con trỏ [* cough *] cũng có thể nhanh hơn. * [Nhưng đừng lưu ý rằng điều này không hoạt động:)] * – MatBailie

Các vấn đề liên quan