2011-09-06 25 views
5

Tôi có bảng sau:Sql tổng tiến

CREATE TABLE tbl_proc(
    [proc] float, 
    subscriber bigint 
) 

dữ liệu:

proc | subscriber 
-----|----------- 
0.7 | 123456 
0.5 | 1234567 
0.3 | 12345  
0.3 | 45678  
0.3 | 1234 
0.2 | 123455 
0.1 | 894562 

Tôi muốn tìm một phương pháp tốt đẹp để thêm một cột mới vào bảng đại diện cho tổng các các giá trị trên.

Kết quả:

proc | subscriber | col3 
-----|------------|------------ 
0.7 | 123456  | 0.7 
0.5 | 1234567 | 1.2 -- 0.7 + proc 
0.3 | 12345  | 1.5 
... 

tôi thấy phương pháp sau:

Select a.[proc],SUM(b.[proc]) 
from tbl_proc a, tbl_proc b 
where a.[proc] <= b.[proc] and (a.[proc] <> b.[proc] or a.subscriber >= b.subscriber) 
group by a.[proc],a.subscriber 
order by a.[proc] desc 

Trong bảng của tôi dữ liệu được sắp xếp desc bởi proc. Cột đăng ký cũng là duy nhất.

Phương pháp này tôi thấy hơi đắt một chút (bảng của tôi lớn). Do lý do hiệu suất, tôi không được coi là giải pháp giống con trỏ thứ.

Mọi đề xuất?


Cập nhật:

Tôi googled vấn đề hơn một chút và tôi thấy các "Update để một biến địa phương" giải pháp trên trang này:

http://geekswithblogs.net/Rhames/archive/2008/10/28/calculating-running-totals-in-sql-server-2005---the-optimal.aspx

As far như tôi đã thử nghiệm điều này chứng tỏ là giải pháp tốt nhất cho đến nay.

khai báo @runningTotal nổi = 0

CẬP NHẬT tbl_proc SET @RunningTotal = new_col = @RunningTotal + [proc] TỪ tbl_proc

+0

Có lẽ bạn nên thử * * giải pháp con trỏ và so sánh kết quả, bạn có thể ngạc nhiên. Ngoài ra, bạn đã tìm kiếm giải pháp cho vấn đề của mình chưa? Tôi Googled "sql chạy tổng số" và tìm thấy một tải của câu trả lời. – Tony

+1

@Martin Tôi đã sửa lỗi của mình. Sry –

+0

Kiểu truy vấn này sẽ nhiều * nhiều *, dễ dàng hơn nhiều trong Denali do [cải tiến cho mệnh đề 'OVER'] (http://www.geniiius.com/blog/t-sql-enhancements-over-clause/) , nhưng đồng ý với những người khác rằng bạn cần thêm thuộc tính để xác định đơn đặt hàng. – onedaywhen

Trả lời

9

này thường được gọi là tính toán tổng số chạy.

Có một phương pháp rất nhanh để thực hiện những gì bạn muốn gọi là "quirky update" nhưng dựa trên hành vi không có giấy tờ. Khác với con trỏ là cách nhanh nhất cho các bộ lớn vì khối lượng công việc cho những phát triển này tuyến tính trong khi khối lượng công việc nối tam giác của bạn tăng theo cấp số nhân (cho đến phiên bản tiếp theo và the improved OVER clause).

Xem this document bởi Itzik Ben Gan để biết thêm về vấn đề này.

1

cũng lưu ý - không thực hành tốt. điều này chắc chắn không được chuẩn hóa.
Đơn đặt hàng không rõ ràng.

tôi sẽ tránh điều này nếu tôi là bạn. thay vì viết một khung nhìn hoặc truy vấn trả về động này.

+0

+1 cho điểm 'ORDER BY'. Mặc dù ít bị thuyết phục bởi điểm khác. Đây là một điều khá đắt tiền để tính toán lại. –

2

Con trỏ có thể là một lựa chọn tốt cho bạn. Họ không phải luôn luôn xấu - trên thực tế, với bộ dữ liệu lớn trong những tình huống nhất định (như của bạn, tôi nghĩ) họ có thể thực hiện các hoạt động dựa trên thiết lập.

Tôi nhìn vào trong này một khi trở lại - một số câu trả lời tốt & ý kiến ​​nhân dân gửi mà có thể relavent với những gì bạn đang làm việc trên: When are TSQL Cursors the best or only option?

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