2010-08-30 37 views
3

給定一個表:SQL - 更新一個表,使得列求和給出另一列的關鍵

 
| id | price | item | total | 
| 0 | 1.0 | A |  | 
| 1 | 1.0 | A |  | 
| 2 | 0.1 | B |  | 
| 3 | 1.0 | B |  | 
| 4 | 2.1 | B |  | 
| 5 | 1.0 | A |  | 
| 6 | 2.0 | C |  | 

是有一個SQL語句,這將導致這個?

 
| id | price | item | total | 
| 0 | 1.0 | A | 3.0 | 
| 1 | 1.0 | A | 3.0 | 
| 2 | 0.1 | B | 3.1 | 
| 3 | 1.0 | B | 3.1 | 
| 4 | 2.1 | B | 3.1 | 
| 5 | 1.0 | A | 3.0 | 
| 6 | 2.0 | C | 2.0 | 

其中,每個項目都具有所有的價格sum'd。我可以做一個SELECT ...

SELECT SUM(price), item FROM table GROUP BY item;

,但我無法弄清楚如何做一個更新。附:我正在使用Postgres。

謝謝

回答

2

創建一個AFTER觸發器,用於更新聚合行。

+0

是,觸發器肯定比我的簡單更新命令更好。 – 2010-08-30 07:01:59

0
UPDATE table SET total = (SELECT SUM(price) FROM test2 WHERE item = 'A' GROUP BY item) WHERE item = 'A'; 
2

感謝您的回答,讓我想到更多。最終我能夠通過使用臨時第二張桌子來做我想做的事。

這就是我所做的。

創建測試數據:

 
CREATE TABLE test (id INT PRIMARY KEY, 
        price DECIMAL, 
        item CHAR(1), 
        total DECIMAL); 

INSERT INTO test VALUES(0, 1.0, 'A', NULL), 
         (1, 1.0, 'A', NULL), 
         (2, 0.1, 'B', NULL), 
         (3, 1.0, 'B', NULL), 
         (4, 2.1, 'B', NULL), 
         (5, 1.0, 'A', NULL), 
         (6, 2.0, 'C', NULL); 

生成的臨時表:

 
SELECT SUM(price), item INTO temp_table FROM test GROUP BY item; 

更新:

 
UPDATE test SET total = sum FROM temp_table WHERE temp_table.item=test.item; 

清理:

 
DROP TABLE temp_table; 

其中yeilds:

 
select * FROM test ORDER BY id; 

id | price | item | total 
----+-------+------+------- 
    0 | 1.0 | A | 3.0 
    1 | 1.0 | A | 3.0 
    2 | 0.1 | B | 3.2 
    3 | 1.0 | B | 3.2 
    4 | 2.1 | B | 3.2 
    5 | 1.0 | A | 3.0 
    6 | 2.0 | C | 2.0 
(7 rows) 
相關問題