2009-10-08 27 views
5

Giả sử tôi có bảng nàySELECT SUM là trường

bảng (a, b, c, d). Các kiểu dữ liệu không quan trọng.

Tôi muốn làm điều này

select a as a1,b as b1,c as c1, 
     (select sum(d) from table where a=a1 and b=b1) as total 
from table 
group by a,b,c 

... nhưng tôi không thể tìm thấy một cách (sqldeveloper giữ phàn nàn với "từ khoản không tìm thấy".)

Có cách nào? Có thể không?

+0

Thanks guys. Tôi đã có nhiều hơn tôi đang tìm kiếm, và biết tôi sẽ đọc về PARTITION và OVER. Đây là những gì tôi thích về SO. – Tom

+0

thats "bây giờ tôi sẽ đọc ..." – Tom

Trả lời

8
SELECT a as a1,b as b1,c as c1, 
     (
     SELECT SUM(d) 
     FROM mytable mi 
     WHERE mi.a = mo.a 
       AND mi.b= mo.b 
     ) as total 
FROM mytable 
GROUP BY 
     a, b, c 

Đó là đơn giản hơn nhiều và hiệu quả để viết lại nó như thế này:

SELECT a AS a1, B AS b1, c AS c1, SUM(SUM(d)) OVER (PARTITION BY a, b) AS total 
FROM mytable 
GROUP BY 
     a, b, 

Lưu ý SUM(SUM(d)) đây.

Trong cùng, SUM là hàm tổng hợp. Nó tính toán SUM(d)a-b-c.

Phần ngoài cùng SUM là chức năng phân tích. Nó tính tổng của 's a-b -wise, và trả về giá trị cùng với mỗi hàng.

2

Bạn có ý nghĩa như thế này không?

select a as a1, 
     b as b1, 
     c as c1, 
     sum(sum(d)) OVER (PARTITION BY a, b) AS total 
from table 
group by a,b,c 
+0

"OVER (PARTITION BY a, b)" mua cho bạn? Điều này có làm việc mà không có một phần của tuyên bố? – Jay

+0

Không. Mệnh đề OVER trong conjuction với PARTITION BY chia bộ kết quả thành nhiều phân vùng và sau đó áp dụng hàm tổng hợp cho các phân vùng này. Để biết thêm thông tin, vui lòng đọc http://msdn.microsoft.com/en-us/library/ms189461.aspx. –

+0

Bạn cần một 'SUM (SUM (d))' ở đây. – Quassnoi

1

bạn có thể làm điều đó với bí danh:

SELECT a AS a1, b AS b1, c AS c1, 
     (SELECT SUM(d) 
      FROM test_t t_in 
      WHERE t_in.a = t.a 
      AND t_in.b = t.b) AS total 
    FROM test_t t 
GROUP BY a, b, c