2012-07-06 29 views
12

我已經閱讀(this),但無法找到一種方法來實現它以解決我的具體問題。我知道SUM()是一個聚合函數,它沒有意義不使用它,但在這種特定情況下,我必須在保持每一行的同時獲得所有結果。使用SUM()而不分組結果

這裏的表:

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

我需要SUM()量,但保留每一條記錄,所以輸出應該是這樣的:

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

我有此查詢,但它只是資金每一行,並不是所有的結果放在一起:

SELECT 
    a.id, 
    SUM(b.amount) 

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

沒有SUM()我t只會返回一個單行,但我需要保持所有的ID ...

注意:這是一個非常基本的例子,我可以使用PHP在這裏做到這一點,但顯然,表是更大,有更多行和列,但那不是重點。

回答

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

您需要在表上執行每一行的總和值的cartesian join每個id。由於子查詢只有一個結果(49),所以它基本上只能用於每個id

+0

天才!謝謝你:) – Anonymous 2012-07-06 07:39:25

5

加入原始表的總和與子查詢:

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

@Bohemian,仔細看,子查詢是不是'SELECT'子句中,但實際上是在部分創建笛卡爾積的'FROM'子句。它只執行一次。 – 2012-07-06 07:35:44

+0

@ZaneBien對 - 我刪除了我的評論 – Bohemian 2012-07-06 12:24:26

0

這確實只是一個sum()查詢,所以應該進行確定:與MS SQL

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

你可以使用OVER()

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

--- OVER PARTITION ID
PARTITION BY當你想要做SUM()每個MONTH時,它是非常有用的,或者做季度報告銷售S或每年... (注意不同需要它做的所有行)

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

我一定是錯的,但是你認真寫出了數據庫中的每一個值嗎?這不是非常程序化,因此不是很有幫助。 – Anonymous 2015-09-13 09:20:52

+0

它是例子,你可以用你複雜的查詢來替換「FROM(...)」。第二個例子是PARTITION BY,當你想每個MONTH執行SUM()時它是非常有用的,例如 – 2015-09-13 15:27:51