2012-04-06 32 views
13

Tôi không thể hiểu lỗi của mã nàyLàm thế nào tôi có thể sử dụng SUM() OVER()

ID  AccountID  Quantity 
1   1    10   Sum = 10 
2   1    5    = 10 + 5 = 15 
3   1    2    = 10 + 5 + 2 = 17 
4   2    7    = 7 
5   2    3    = 7 + 3 = 10 

SELECT ID, AccountID, Quantity, 
     SUM(Quantity) OVER (PARTITION BY AccountID) AS TopBorcT, 
FROM tCariH 
+4

Vui lòng cải thiện cách trình bày câu hỏi và rập khuôn. Câu hỏi ở đây là gì? – Marshal

+2

Kết quả mong đợi và thực tế xin vui lòng? –

Trả lời

24

Có vẻ như bạn mong đợi các truy vấn trả lại chạy tổng số, nhưng nó phải đã đưa cho bạn những giá trị tương tự cho cả hai phân vùng của AccountID.

Để có được tổng số chạy với SUM() OVER(), bạn cần phải thêm một tiểu khoản ORDER BY sau PARTITION BY …, như thế này:

SUM(Quantity) OVER (PARTITION BY AccountID ORDER BY ID) 

Nhưng hãy nhớ rằng, không phải tất cả các hệ thống cơ sở dữ liệu hỗ trợ ORDER BY trong OVER khoản của một tổng hợp cửa sổ chức năng. (Ví dụ, SQL Server không hỗ trợ nó cho đến khi phiên bản mới nhất, SQL Server 2012.)

+7

Để làm rõ điều này: một tổng() không có 'order by' sẽ chỉ tổng hợp tất cả các giá trị cho nhóm được xác định bởi phân vùng. Btw: SQL Server là/là chỉ (AFAIK) DBMS hỗ trợ chức năng cửa sổ mà không hỗ trợ một đơn đặt hàng bằng trong mệnh đề phân vùng. Những người khác (PostgreSQL, Oracle, DB2, Teradata) không có giới hạn đó –

+0

Tôi nghĩ bạn phải đúng về các hệ thống với sự hỗ trợ giới hạn các chức năng tổng hợp cửa sổ. Tôi đã nghi ngờ điều đó nhưng không chắc lắm. Có một cái nhìn khác (liên quan) câu hỏi của OP's, bây giờ tôi có thể thấy rằng SQL Server * là * hệ thống cơ sở dữ liệu của OP đặc biệt trong trường hợp này, và một trước năm 2012 quá. –

+0

Từ những gì tôi có thể nói, 'ORDER BY' đã được thêm vào trong Sql 2005: http://msdn.microsoft.com/en-us/library/ms189461(v=sql.100).aspx –

6

nếu bạn đang sử dụng SQL 2012 bạn nên thử

SELECT ID, 
     AccountID, 
     Quantity, 
     SUM(Quantity) OVER (PARTITION BY AccountID ORDER BY AccountID rows between unbounded preceding and current row) AS TopBorcT, 
FROM tCariH 

nếu có, trật tự tốt hơn bằng cách cột ngày.

1

Query sẽ là như thế này:

SELECT ID, AccountID, Quantity, 
     SUM(Quantity) OVER (PARTITION BY AccountID) AS TopBorcT 

     FROM #Empl ORDER BY AccountID 

phân vùng bởi việc làm như nhóm bằng. Ở đây chúng tôi đang nhóm theo AccountID để tổng hợp sẽ tương ứng với AccountID.

Đầu tiên trường hợp đầu tiên, AccountID = 1, sau đó tổng hợp (số lượng) = 10 + 5 + 2 => Đối AccountID = 2, sau đó tổng hợp (Số lượng) = 7 + 3 => 10

vì vậy kết quả sẽ xuất hiện như được đính kèm snapshot.

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