2012-07-06 29 views
12

Tôi đã đọc (this), nhưng không thể tìm ra cách để triển khai nó cho vấn đề cụ thể của tôi. Tôi biết SUM() là một hàm tổng hợp và không có ý nghĩa gì khi sử dụng nó như vậy, nhưng trong trường hợp cụ thể này, tôi phải SUM() tất cả các kết quả trong khi vẫn duy trì mọi hàng.Sử dụng SUM() mà không nhóm các kết quả

Dưới đây là bảng:

--ID-- --amount-- 
    1  23 
    2  11 
    3  8 
    4  7 

tôi cần phải SUM() số tiền, nhưng giữ mọi kỷ lục, vì vậy sản lượng nên được như:

--ID-- --amount-- 
    1  49 
    2  49 
    3  49 
    4  49 

Tôi đã truy vấn này, nhưng nó chỉ tiền mỗi hàng, không phải tất cả kết quả cùng nhau:

SELECT 
    a.id, 
    SUM(b.amount) 

FROM table1 as a 
JOIN table1 as b ON a.id = b.id 
GROUP BY id 

Nếu không có SUM() tôi t sẽ chỉ trả lại một hàng duy nhất, nhưng tôi cần duy trì tất cả các ID ...

Lưu ý: Có một ví dụ khá cơ bản và tôi có thể sử dụng php để làm điều này ở đây, nhưng rõ ràng là bảng lớn hơn và có nhiều hơn hàng và cột, nhưng đó không phải là vấn đề.

Trả lời

12
SELECT a.id, b.amount 
FROM table1 a 
CROSS JOIN 
(
    SELECT SUM(amount) amount FROM table1 
) b 

Bạn cần phải thực hiện một cartesian join giá trị tổng của mỗi hàng trong bảng để mỗi id. Vì chỉ có một kết quả của việc chọn lựa (49), về cơ bản nó chỉ được gắn vào mỗi id.

+0

Genius! Cảm ơn cho rằng :) – Anonymous

5

Tham gia vào bảng gốc để tổng với một subquery:

SELECT * FROM table1, (SELECT SUM(amount) FROM table1 AS amount) t 
+0

@Bohemian, nhìn gần hơn, subquery không phải là trong 'khoản SELECT' nhưng thực chất là một phần của mệnh đề 'FROM' tạo ra một sản phẩm Descartes. Nó chỉ thực hiện một lần. –

+0

@ZaneBien phải - tôi đã xóa nhận xét của mình – Bohemian

0

này không chỉ là một sum() truy vấn, vì vậy nó nên thực hiện OK:

SELECT a.id, b.amount 
FROM table1 a 
cross join (SELECT SUM(amount) as amount FROM table1 AS amount) b 
5

với MS SQL bạn có thể sử dụng VỀ()

select id, SUM(amount) OVER() 
from table1 



select id, SUM(amount) OVER() 
from (
    select 1 as id, 23 as amount 
    union all 
    select 2 as id, 11 as amount 
    union all 
    select 3 as id, 8 as amount 
    union all 
    select 4 as id, 7 as amount 
) A 

enter image description here

--- VỀ PARTITION ID
PARTITION BY rất hữu ích khi bạn muốn thực hiện SUM() mỗi MONTH ví dụ hoặc thực hiện bán báo cáo hàng quý s hoặc hàng năm ... (Lưu ý cần phân biệt nó đang làm cho tất cả các hàng)

select distinct id, SUM(amount) OVER(PARTITION BY id) as [SUM_forPARTITION] 
from (
    select 1 as id, 23 as amount 
    union all 
    select 1 as id, 23 as amount 
    union all 
    select 2 as id, 11 as amount 
    union all 
    select 2 as id, 11 as amount 
    union all 
    select 3 as id, 8 as amount 
    union all 
    select 4 as id, 7 as amount 
) OverPARTITIONID 

enter image description here

+0

Tôi phải sai, nhưng bạn đã nghiêm túc viết ra mọi giá trị duy nhất từ ​​cơ sở dữ liệu? Đó không phải là rất có lập trình và do đó không phải là rất hữu ích. – Anonymous

+0

ví dụ, bạn có thể thay thế "FROM (...) với truy vấn phức tạp của bạn .. Ví dụ thứ hai là với PARTITION BY rất hữu ích khi bạn muốn thực hiện SUM() mỗi MONTH ví dụ –

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